Scalaで List(1, 2, 3, 1) を Map(1 -> 2, 2 -> 1, 3 -> 1)に変換する方法。ただし関数型縛り

Scalaで List(1, 2, 3, 1) を Map(1 -> 2, 2 -> 1, 3 -> 1)に変換する方法。ただし関数型縛り。なんどけど最頻値を計算したいだけなので、Mapに変換することは必須ではない....です...
2
加藤潤一(かとじゅん) @j5ik2o

List((1,1), (2,1), (3,1), (1,1)) の 要素を(K,V)とみて、Map((1->2), (2 -> 1), (3 -> 1)) するにはどうするのがよいかな。要は統計の最頻値を求めたい。考え中。

2011-12-04 12:51:58
Kenji Yoshida @xuwei_k

.@j5ik2o こういうことですか? List((1,1), (2,1), (3,1), (1,1)).toMap.groupBy(_._1).map{case (k,v) => k -> v.map{_._2}.sum }

2011-12-04 13:01:50
加藤潤一(かとじゅん) @j5ik2o

@xuwei_k いやちがったw Map((1->2), (2 -> 1), (3 -> 1)) こうならないといけない。1が2個

2011-12-04 13:06:29
加藤潤一(かとじゅん) @j5ik2o

List(1,2,3,1) -> List((1,1), (2,1), (3,1), (1,1)) -> Map((1->2), (2 -> 1), (3 -> 1)) こうしたい

2011-12-04 13:07:22
ねこはる @halcat0x15a

@j5ik2o @xuwei_k List((1,1), (2,1), (3,1), (1,1), (1, 1)).groupBy(_._1).map { case (key, value) => key -> value.size } こんなの?

2011-12-04 13:08:22
akr @akr

@j5ik2o groupBy はどうですか?

2011-12-04 13:10:57
akr @akr

@j5ik2o こんな感じでどうでしょ List(1, 2, 3, 1).groupBy(a => a).map(a => (a._1 -> a._2.size))

2011-12-04 13:14:48
ねこはる @halcat0x15a

@j5ik2o あ、すいません。 勝手に要素増やしてました・・・・

2011-12-04 13:16:29
t_yano @t_yano

@j5ik2o こうですか? List(1,2,3,1).zip(List(1,1,1,1)).foldLeft(Map[Int,Int]()) { (x, y) => x + y }

2011-12-04 13:27:33
加藤潤一(かとじゅん) @j5ik2o

@t_yano 結果が Map(1 -> 1, 2 -> 1, 3 -> 1) となっていますが、 Map(1 -> 2, 2 -> 1, 3 -> 1) を期待していますw

2011-12-04 13:31:49
t_yano @t_yano

@j5ik2o あータプルの右を合計しているのか。

2011-12-04 13:33:08
Kenji Yoshida @xuwei_k

@j5ik2o あとは、こういう処理の場合、要素少ないならいいけれど、大量のデータをやる場合はwithFilterとかiterator使って中間データ削除すると実行効率よくなりますね

2011-12-04 13:33:12
Yasushi Abe @yasushia

@j5ik2o Mapに順序を期待するのはまちがっているかと。 で、こうなりました List(1,2,3,1).map((_,1)).groupBy(_._1).toSeq.sortBy(_._1).map{case (k,v) => (k,v.map(_._2).sum)}

2011-12-04 13:39:48
t_yano @t_yano

@j5ik2o あー初期値が1だってだけだから、別にzipはいらいないですねー。Mapにまだなければ 1 にすればいいので。 http://t.co/uz1j4uil

2011-12-04 13:55:15
加藤潤一(かとじゅん) @j5ik2o

@makotan おおお、これは最もエレガントな気がw

2011-12-04 14:04:09