5

次のような3タプルのリストがあります[読みやすくするために改行を追加しました]:

(2, 127, 3)
(12156, 127, 3)
(4409, 127, 2) <-- 4409 occurs 2x
(1312, 127, 12) <-- 1312 occurs 3x

(4409, 128, 1) <-- 
(12864, 128, 1)
(1312, 128, 1) <-- 
(2664, 128, 2)

(12865, 129, 1)
(183, 129, 1)
(12866, 129, 2)
(1312, 129, 10) <--

最初のエントリに基づいて要約したいと思います。最初のエントリは一意である必要があります。

結果は次のようになります。

(2, 127, 3)
(12156, 127, 3)
(4409, 127, 3) <- new sum = 3
(1312, 127, 23) <- new sum = 23

(12864, 128, 1)
(2664, 128, 2)

(12865, 129, 1)
(183, 129, 1)
(12866, 129, 2)

Scalaでこれをどのように達成できますか?

4

3 に答える 3

6

これを試して:

list groupBy {_._1} mapValues {v => (v.head._1, v.head._2, v map {_._3} sum)}

中央のエントリは保持され、入力リストに表示された最初のエントリが常に使用されます。

于 2012-04-08T19:13:31.453 に答える
3

真ん中のエントリを無視できる場合は、次のようにします。

val l = List(('a,'e,1), ('b,'f,2), ('a,'g,3), ('b,'h,4))
l.groupBy(_._1).mapValues(_.map(_._3).sum) 
// Map('b -> 6, 'a -> 4)

真ん中のエントリを維持する必要がある場合:

l.groupBy(_._1).map { 
  case (_, values) =>
    val (a,b,_) = values.head
    (a, b, values.map(_._3).sum)
} 
// List(('b,'f,6), ('a,'e,4))
于 2012-04-08T19:09:23.053 に答える
0

モノイドの概念を使用できます。エントリの最初の2つの値がキー値を構築し、残りの値が関連する値自体を構築する場合は、マップを使用できます。

マップを取得したら、次のように進めることができます 。2つのマップをマージし、同じキーの値を合計する最良の方法は?

于 2012-04-09T10:02:57.667 に答える