gpt4 book ai didi

Scala 如何将 List 的等值元素放入子列表中

转载 作者:行者123 更新时间:2023-12-01 23:49:54 25 4
gpt4 key购买 nike

case class E(timestamp: Long, value: Double)

我有一个实例 E 的列表。列表中的元素按时间戳排序。我想将具有 0 值的元素 block 分组到子列表中并删除非零元素。例如,

val xs = List(E1, E2, E3, E4, E5, E6, E7, E8, E9, E10)

其中 E2、E3、E4、E7、E8、E10 的值为 0

result = List(List(E2, E3, E4), List(E7, E8), List(E10))

在 Scala 中执行此操作的最佳方法是什么?谢谢!

最佳答案

这是一行代码(使用 foldLeft + 过滤器):

scala> val l = List(1, 0, 0, 0, 2, 3, 0, 0, 5, 6, 0)
l: List[Int] = List(1, 0, 0, 0, 2, 3, 0, 0, 5, 6, 0)

scala> (l ++ List(1)).foldLeft((List(List[Int]()), List[Int]()))((a, b) => if (b != 0) (a._1 +: a._2, Nil) else (a._1, a._2 +: b))._1.filter(_.nonEmpty)
res26: List[List[Int]] = List(List(0, 0, 0), List(0, 0), List(0))

更具可读性的版本:

def groupByPred[T](l: List[T], predicate: T => Boolean = (x: T) => x == 0) = {
case class Acc(perm: List[List[T]] = Nil, temp: List[T] = Nil)
val raw = l.foldLeft(Acc())((a, b) =>
if (!predicate(b)) Acc(a.perm :+ a.temp, Nil) else Acc(a.perm, a.temp :+ b))
(raw.perm :+ raw.temp).filter(_.nonEmpty)
}

请注意,“:+”连接需要 O(n),因此这里最好使用 ListBuffer 而不是 List。

关于Scala 如何将 List 的等值元素放入子列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com