作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!