让我们说有一个Scala Map,例如:
val map:Map[String, List[String]= Map("Apple" -> List("Red", "Tasty"), "Orange" -> List("Sour", "Orange"), "Banana" -> List("Yellow"), "Mango" -> List("Best", "Yellow", "Favorite"))
现在我想将其转换为以下地图,该地图仅使用map._1.size作为键,并将具有相同键的值组合在一起。
Map(5 -> List("Best", "Yellow", "Favorite", "Red", "Tasty"), 6 -> List("Sour", "Orange", "Yellow"))
那怎么办呢?
答案 0 :(得分:4)
map.groupBy(_._1.length).map { case (length, m) =>
length -> m.values.flatten
}
首先按照长度进行分组,然后获得Map[Int, Map[String, List[String]]]
然后,您需要展平这些地图值以获得最终结果。你保留了密钥(length
)。
答案 1 :(得分:2)
您只需按照您所说的大小进行分组,然后进一步处理生成的集合。
F.ex:
map.groupBy(_._1.size).mapValues(_.values).mapValues(_.flatten)
编辑:Insan-e:答案是优越的,因为它避免了对集合的一次迭代,即使始终存在的Scala模式匹配使它更加冗长。
答案 2 :(得分:1)
另一种可能的解决方案可能是:
scala> map.groupBy(_._1.size).map(x => (x._1,x._2.values.flatten))
res89: scala.collection.immutable.Map[Int,Iterable[String]] = Map(5 -> List(Red, Tasty, Best, Yellow, Favorite), 6 -> List(Sour, Orange, Yellow))
答案 3 :(得分:0)
val result = map.map {case (string,list) => list.map( x => (string.length,x) ) }.flatten.groupBy(_._1).map{ case (int,list) => (int,list.map(_._2)) }