使用较小的键集将Scala映射和分组映射到另一个映射

时间:2017-09-05 09:52:27

标签: scala dictionary

让我们说有一个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"))

那怎么办呢?

4 个答案:

答案 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)) }