[英]How to use MaxBy in Scala
我有一個列表,希望將其分組,然后為每個組獲取最大值。 例如,一個用戶的動作列表,獲取每個用戶的最后一個動作。
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)
我應該改變什么?
謝謝尼爾
因此,您具有一個String
Map
(userId) -> 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)
您的compare
方法應為:
def compare(that: UserActions) = this.actionTime.compareTo(that.actionTime)
然后按照@jwvh所示執行actions.groupBy(_.userId).mapValues(_.max)
。
您想通過使用userId對值進行分組。 您可以使用groupBy()來實現。
actions.groupBy(_.userId)
然后,您只能從鍵值對中獲取值。
actions.groupBy(_.userId).values
您已使用maxBy(_._ 2)。 因此,我認為您想通過比較第二個值來獲得最大值。 您可以使用map()來實現。
actions.groupBy(_.userId).values.map(_.maxBy(_._2))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.