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
相关产品推荐
相关产品推荐

