簡體   English   中英

如何在Scala中使用MaxBy

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM