编辑:添加了一个事实,即列表已排序,并且意识到“重复”具有误导性,将其替换为标题中的“冗余”。

我有一个排序的条目列表,列出了给定时间间隔内的生产值。稍后指出完全相同的值的条目不会添加任何信息,因此可以安全地将其排除在外。

case class Entry(minute:Int, production:Double)
val entries = List(Entry(0, 100.0), Entry(5, 100.0), Entry(10, 100.0), Entry(20, 120.0), Entry(30, 100.0), Entry(180, 0.0))

尝试使用scala 2.8收集功能,到目前为止,我已经有了以下可行的实现:
entries.foldRight(List[Entry]()) {
  (entry, list) => list match {
    case head :: tail if (entry.production == head.production) => entry :: tail
    case head :: tail => entry :: list
    case List() => entry :: List()
  }
}
res0: List[Entry] = List(Entry(0,100.0), Entry(20,120.0), Entry(30,100.0), Entry(180,0.0))

任何意见?我会错过一些scala魔术吗?

最佳答案

当您比较列表中的连续条目时,首先使用zip -ping列表的尾部以获取连续元素对的列表。

在下面,我从列表中获得第一个条目,并使用collect同时过滤出生产不变的对,对于其余的对,映射e2。 (collect是Scala 2.8中的新增功能,有一段时间称为partialMap)

scala> entries.head :: ((entries zip entries.tail).collect {
           case (Entry(_, p1), e2@Entry(_, p2)) if p1 != p2 => e2
       })
res13: List[Entry] = List(Entry(0,100.0), Entry(20,120.0), Entry(30,100.0), Entry(180,0.0))

更新为简单起见,这假定条目不为空。

10-07 19:05
查看更多