2017-06-14 65 views
1

可以说我有以下列表:斯卡拉转换地图列表基于地图键映射列出

val myList = List(Map(1 -> 1), Map(2 -> 2), Map(2 -> 7))

我想这个列表转换为Int的单一地图 - >目录(智力)。如果我们有重复的键,那么这两个值应该包含在结果值列表中。

Map(2 -> List(7,2),1 -> List(1)) 

我想出了这个工作解决方案,但它似乎过度和笨重。

myList.foldLeft(scala.collection.mutable.Map[Int,List[Int]]()) {(result,element) => 
     for((k,v) <- element) { 
     if (result.keySet.contains(k)) { 
      result(k) = result(k).:: (v) 
     } else { 
      result += (k -> List(v)) 
     } 
     } 
     result 
    } 

这里有更好或更有效的方法吗?

回答

4
myList 
    .flatten 
    .groupBy(_._1) 
    .mapValues(_.map(_._2)) 
1

您可以使用一个简单(但可能效率较低)代码:

val myList = List(Map(1 -> 1), Map(2 -> 2), Map(2 -> 7)) 
val grouped = myList.flatMap(_.toList).groupBy(_._1).mapValues(l => l.map(_._2)) 
println(grouped) 

地图(2 - >列表(2,7),1 - >列表(1))

这个想法是首先得到List所有元组Map s中的所有元组,然后对它们进行分组。