2017-08-22 16 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) 

私は大丈夫ですが、私はmaxByを追加しようとしたとき、私はエラーを取得する地図

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

受け取る:

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(USERID)のMap-> List[UserActions]持っていて、ちょうどその最大の要素に減少し、各リストをしたいですか?

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

すでに別のUserActions要素を比較/注文するのに必要な情報を追加しましたので、あなたはmaxBy()は必要ありません。

同様に、元のリストの最大値が必要な場合は、

actions.max 

他のいくつかのパラメータによって測定されるように、あなたが最大のを望んでいた場合は、maxBy()を使用すると思います。

actions.maxBy(_.actionId.length) 
1

あなたcompare方法は次のようになります。

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

その後@jwvhが示すようにactions.groupBy(_.userId).mapValues(_.max)を行います。

関連する問題