2012-10-06 53 views
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)) 

什麼是做它的功能呢?我嘗試整理列表並返回頭部。但是,這隻會返回一個似乎不正確的單個數據項。

+1

如果你這樣做了很多,你可能會對通用方法感興趣,你可以稱之爲'multiMinBy(dataitems)(_。timestamp)'。請參閱http://stackoverflow.com/q/8235462/770361上的接受答案。這可能比你需要的更通用;你可能想簡化它,直接返回List [A](而不是任何集合類型)。 –

回答

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> 
3

這很容易做到這一點在兩個通道:

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

這是不太有趣的事情是在一個通:

(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 
}} 

這些都是比分組一切更有效時間戳,然後扔掉除了第一個之外的所有東西。