播放Scala - groupBy删除重复值

时间:2014-10-14 09:59:09

标签: scala playframework scala-collections

我将groupBy函数应用于我的List集合,但是我想删除Map的值部分中的重复值。这是最初的List集合:

PO_ID       PRODUCT_ID      RETURN_QTY
1           1               10
1           1               20
1           2               30
1           2               10

当我将groupBy应用于该List时,它将产生如下内容:

(1, 1) -> (1, 1, 10),(1, 1, 20)
(1, 2) -> (1, 2, 30),(1, 2, 10)

我真正想要的是这样的:

(1, 1) -> (10),(20)
(1, 2) -> (30),(10)

那么,有没有删除Map的值[(1,1),(1,2)]中的重复部分? 感谢..

2 个答案:

答案 0 :(得分:4)

对于

val a = Seq( (1,1,10), (1,1,20), (1,2,30), (1,2,10) )

考虑

a.groupBy( v => (v._1,v._2) ).mapValues( _.map (_._3) )

提供

Map((1,1) -> List(10, 20), (1,2) -> List(30, 10))

请注意,mapValues对从List[List]获得的groupBy个三元组进行操作,而在map中,我们提取每个三元组的第三个元素。

答案 1 :(得分:1)

首先将元组分开是否更容易?

scala> val ts = Seq( (1,1,10), (1,1,20), (1,2,30), (1,2,10) )
ts: Seq[(Int, Int, Int)] = List((1,1,10), (1,1,20), (1,2,30), (1,2,10))

scala> ts map { case (a,b,c) => (a,b) -> c }
res0: Seq[((Int, Int), Int)] = List(((1,1),10), ((1,1),20), ((1,2),30), ((1,2),10))

scala> ((Map.empty[(Int, Int), List[Int]] withDefaultValue List.empty[Int]) /: res0) { case (m, (k,v)) => m + ((k, m(k) :+ v)) }
res1: scala.collection.immutable.Map[(Int, Int),List[Int]] = Map((1,1) -> List(10, 20), (1,2) -> List(30, 10))

猜不是。