2017-08-22 74 views
0

我有一個列表,我想將其分組,然後爲每個組獲得最大值。例如,用戶的動作列表,獲取每個用戶的最後一個動作。如何在Scala中使用MaxBy

case class UserActions(userId: String, actionId: String, actionTime: java.sql.Timestamp) extends Ordered[UserActions] { 
    def compare(that: UserActions) = this.actionTime.before(that.actionTime).compareTo(true) 
} 
val actions = List(UserActions("1","1",new java.sql.Timestamp(0L)),UserActions("1","1",new java.sql.Timestamp(1L))) 

當我嘗試以下方法GROUPBY:

actions.groupBy(_.userId) 

我收到一個地圖

scala.collection.immutable.Map[String,List[UserActions]] = Map(1 -> List(UserActions(1,1,1970-01-01 00:00:00.0), UserActions(1,1,1970-01-01 00:00:00.001)) 

這很好,但是當我嘗試添加maxBy我得到一個錯誤:

actions.groupBy(_.userId).maxBy(_._2) 
<console>:13: error: diverging implicit expansion for type 
Ordering[List[UserActions]] 
starting with method $conforms in object Predef 
     actions.groupBy(_.userId).maxBy(_._2) 

我應該改變什麼?

感謝 尼爾

回答

1

所以,你有一個的String(用戶ID)Map-> List[UserActions]並希望每個列表減少到只有它的最大元素?

actions.groupBy(_.userId).mapValues(_.max) 
//res0: Map[String,UserActions] = Map(1 -> UserActions(1,1,1969-12-31 16:00:00.0)) 

你不需要maxBy()因爲你已經添加需要訂購/信息比較不同UserActions元素。

同樣,如果你只是想從原始列表中獲得最大值。

actions.max 

如果您想要通過其他參數測量的最大值,您將使用maxBy()

actions.maxBy(_.actionId.length) 
1

compare方法應該是:

def compare(that: UserActions) = this.actionTime.compareTo(that.actionTime) 

然後做actions.groupBy(_.userId).mapValues(_.max)爲@jwvh節目。