You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala如何函数式实现多分组轮询生成新集合且最大化同组元素间距

实现方案

核心逻辑是按轮次从所有非空分组各取1个元素,拼接所有轮次的结果即可,天然适配任意数量的分组场景。

代码实现

首先是通用的轮询拼接函数:

def interleaveGroups[T](groups: Iterable[Iterable[T]]): Seq[T] =
  LazyList.unfold(groups.map(_.iterator)) { remainingIters =>
    val validIters = remainingIters.filter(_.hasNext)
    if (validIters.isEmpty) None
    else Some((validIters.map(_.next()).toSeq, validIters))
  }.flatten.toSeq

调用示例

针对你给出的测试数据:

val words   = Seq("cat", "dog", "kid", "dee", "ding", "chip", "chord")
val grouped = words.groupBy(_.charAt(0))

// 直接调用,分组顺序和Map遍历顺序一致,输出结果和你给出的预期格式匹配
val res = interleaveGroups(grouped.values)
// 输出样例:Seq("cat", "dog", "kid", "chip", "dee", "chord", "ding")

// 如果需要固定分组顺序,比如按首字母升序排列分组
val sortedRes = interleaveGroups(grouped.toSeq.sortBy(_._1).map(_._2))
// 固定输出:Seq("cat", "dog", "kid", "chip", "dee", "chord", "ding")

实现优势

  • 纯函数式实现,无可变状态,线程安全
  • 基于惰性迭代器实现,处理超大集合时内存占用极低
  • 无需提前感知分组数量和各分组长度,适配所有动态分组场景
  • 同组元素天然实现最大间距,同组两个元素之间会插入其他所有有剩余元素的分组的元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:18:01