You need to enable JavaScript to run this app. 如何在Seq中交换奇偶位置元素并获取不重叠元素对?
优惠活动
大模型
产品
解决方案
定价
更多

如何在Seq中交换奇偶位置元素并获取不重叠元素对?

互不重叠元素对的提取与位置交换实现

核心问题原因

你之前调用sliding得到重叠元素对的核心原因,是没有给方法传入步长参数:Scala中的sliding方法有两个入参,分别是窗口大小、滑动步长。如果只传入窗口大小这一个参数,默认步长为1,自然会出现相邻窗口共享元素的重叠效果。只要将步长设置为和窗口大小一致,就能直接提取到完全互不重叠的元素对。

可落地的实现方案

方案1:调整sliding参数直接取不重叠分组

  • 调用sliding(2, 2)即可生成长度为2的不重叠分组,对每组内部元素做反转后扁平化拼接,自动处理序列长度为奇数时的尾部剩余元素即可。
  • 示例代码:
    val source = Seq(1,2,3,4,5)
    // 步长设为2,得到不重叠的二元分组:Seq(Seq(1,2), Seq(3,4))
    val grouped = source.sliding(2, 2).toSeq
    // 每组反转后拼接,长度为奇数时补回最后未成对的元素
    val result = grouped.flatMap(_.reverse) ++ (if (source.length % 2 == 1) Seq(source.last) else Seq.empty)
    // 最终结果:Seq(2,1,4,3,5),完全匹配需求
    
  • 补充:Scala 2.13及以上版本提供了更简便的grouped(2)方法,效果和sliding(2, 2)完全等价,是专门用来做固定大小不重叠分组的工具方法。

方案2:按索引拆分交叉拼接

  • 可以将原序列按元素所在索引的奇偶性拆分为两个子序列,逐位交叉拼接实现相邻位置交换的效果,逻辑更直观,不需要依赖滑动窗口的逻辑。
  • 示例代码:
    val source = Seq(1,2,3,4,5)
    // 拆分得到偶数索引元素:Seq(1,3,5),奇数索引元素:Seq(2,4)
    val evenIdxElems = source.zipWithIndex.collect { case (elem, idx) if idx % 2 == 0 => elem }
    val oddIdxElems = source.zipWithIndex.collect { case (elem, idx) if idx % 2 == 1 => elem }
    // 逐位交叉拼接,补全奇数长度时的尾部元素
    val result = oddIdxElems.zip(evenIdxElems).flatMap { case (oddElem, evenElem) => Seq(oddElem, evenElem) } ++ evenIdxElems.drop(oddIdxElems.size)
    // 最终结果同样为Seq(2,1,4,3,5)
    

内容的提问来源于stack exchange,提问作者squall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 21:54:03