0
case class DataItem(name: String, timestamp: Long, value: String)
val dataitems = List(DataItem(SpindleSpeed, 1223334444, 20.3333),
                     DataItem(SpindleSpeed, 1223334450, 21.3333),
                     DataItem(SpindleSpeed, 1223334460, 19.3333),
                     DataItem(Load, 1223334444, 70.0023),
                     DataItem(Load, 1223334446, 72.0023),
                     DataItem(Pressure, 1223334444, 20.3333))

私はこのようなリストを持っています。最低のデータ項目を除外する必要がありますtimestamp。同じタイムスタンプを持つ複数の日付アイテムが存在する可能性があります。その場合、それらすべてのデータアイテムが必要です。

上記の場合、フィルタリングされたリストは次のようになると思います。

List(DataItem(SpindleSpeed, 1223334444, 20.3333),
     DataItem(Load, 1223334444, 70.0023),
     DataItem(Pressure, 1223334444, 20.3333))

それを行う機能的な方法は何ですか?リストをソートして頭を返そうとしました。しかし、それは正しくないように見える単一のデータ項目のみを返します。

4

2 に答える 2

4
scala> val SpindleSpeed = "S"
SpindleSpeed: java.lang.String = S

scala> val Pressure = "P"
Pressure: java.lang.String = P

scala> val Load = "L"
Load: java.lang.String = L

scala> case class DataItem(name: String, timestamp: Long, value: Double)
defined class DataItem

scala> val dataitems = List(DataItem(SpindleSpeed, 1223334444, 20.3333),
     |                      DataItem(SpindleSpeed, 1223334450, 21.3333),
     |                      DataItem(SpindleSpeed, 1223334460, 19.3333),
     |                      DataItem(Load, 1223334444, 70.0023),
     |                      DataItem(Load, 1223334446, 72.0023),
     |                      DataItem(Pressure, 1223334444, 20.3333))
dataitems: List[DataItem] = List(DataItem(S,1223334444,20.3333), DataItem(S,1223334450,21.3333), DataItem(S,1223334460,19.3333), DataItem(L,1223334444,70.0023), DataItem(L,1223334446,72.0023), DataItem(P,1223334444,20.3333))

scala> dataitems.groupBy(_.timestamp).minBy(_._1)._2
res2: List[DataItem] = List(DataItem(S,1223334444,20.3333), DataItem(L,1223334444,70.0023), DataItem(P,1223334444,20.3333))

scala> 
于 2012-10-06T17:41:49.370 に答える
3

2 つのパスで簡単に実行できます。

val least = dataitems.minBy(_.timestamp).timestamp
val smalls = dataitems.filter(_.timestamp == least)

1回のパスでそれを行うのはあまり楽しくありません:

(List[DataItem]() /: dataitems){ (xs,x) => xs match {
  case Nil => x :: Nil
  case x0 :: more =>
    if (x0.timestamp < x.timestamp) xs
    else if (x0.timestamp > x.timestamp) x :: Nil
    else x :: x0
}}

これらは両方とも、タイムスタンプですべてをグループ化し、最初のもの以外をすべて捨てるよりも効率的です。

于 2012-10-06T18:38:50.077 に答える