在scala中将贴图列表转换为单个贴图

在scala中将贴图列表转换为单个贴图,scala,Scala,可能重复: 我有以下需要转换为单个贴图的贴图列表。最好的方法是什么 地图列表的类型为: Iterable[Map[String, Map[String,Float]] 例如: val list1 = List(Map(1216 -> Map(key1 -> 144.0)), Map(1253 -> Map(key1 -> 144.0)), Map(1359 -> Map(key1 -> 144.0)) val list2 = Li

可能重复:

我有以下需要转换为单个贴图的贴图列表。最好的方法是什么

地图列表的类型为:

Iterable[Map[String, Map[String,Float]]
例如:

val list1 = List(Map(1216 -> Map(key1 -> 144.0)), 
     Map(1253 -> Map(key1 -> 144.0)), 
     Map(1359 -> Map(key1 -> 144.0))

val list2 = List(Map(1216 -> Map(key2 -> 148.0)), 
     Map(1200 -> Map(key2 -> 144.0)), 
     Map(1359 -> Map(key2 -> 144.0))
我想要一张结果图

val map3 = Map(
        1216 -> Map(key1 -> 1440, key2 -> 148.0), 
        1359 -> Map(key1 -> 1440, key2 -> 144.0))

谢谢

首先,找到新地图中应该存在的所有键,这是两个地图列表中都存在的键(我假设):

然后选择所有这些关键点的值:

val alllist = list1 ++ list2
val map3 = keys.map(k => k -> alllist.flatMap(_ get k).reduceLeft(_ ++ _))

虽然效率不是很高,但它能完成任务。

如果我做对了,像这样的方法就行了:

scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> list1 ++ list2
res2: List[scala.collection.immutable.Map[Int,scala.collection.immutable.Map[java.lang.String,Double]]] = List(Map(1216 -> Map(key1 -> 144.0)), Map(1253 -> Map(key1 -> 144.0)), Map(1359 -> Map(key1 -> 144.0)), Map(1216 -> Map(key2 -> 148.0)), Map(1200 -> Map(key2 -> 144.0)), Map(1359 -> Map(key2 -> 144.0)))


scala> .foldLeft(Map[Int,Seq[Map[String,Double]]]()) { case (acc, v) => 
     | v.mapValues(Seq(_)) |+| acc
     | }
res8: scala.collection.immutable.Map[Int,Seq[Map[String,Double]]] = Map(1216 -> List(Map(key2 -> 148.0), Map(key1 -> 144.0)), 1253 -> List(Map(key1 -> 144.0)), 1359 -> List(Map(key2 -> 144.0), Map(key1 -> 144.0)), 1200 -> List(Map(key2 -> 144.0)))


scala> .map { case(i, m) => (i, m reduce (_ ++ _)) }
res11: scala.collection.immutable.Map[Int,Map[String,Double]] = Map(1216 -> Map(key2 -> 148.0, key1 -> 144.0), 1253 -> Map(key1 -> 144.0), 1359 -> Map(key2 -> 144.0, key1 -> 144.0), 1200 -> Map(key2 -> 144.0))y2 -> 148.0)), Map(1200 -> Map(key2 -> 144.0)), Map(1359 -> Map(key2 -> 144.0)))
scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> list1 ++ list2
res2: List[scala.collection.immutable.Map[Int,scala.collection.immutable.Map[java.lang.String,Double]]] = List(Map(1216 -> Map(key1 -> 144.0)), Map(1253 -> Map(key1 -> 144.0)), Map(1359 -> Map(key1 -> 144.0)), Map(1216 -> Map(key2 -> 148.0)), Map(1200 -> Map(key2 -> 144.0)), Map(1359 -> Map(key2 -> 144.0)))


scala> .foldLeft(Map[Int,Seq[Map[String,Double]]]()) { case (acc, v) => 
     | v.mapValues(Seq(_)) |+| acc
     | }
res8: scala.collection.immutable.Map[Int,Seq[Map[String,Double]]] = Map(1216 -> List(Map(key2 -> 148.0), Map(key1 -> 144.0)), 1253 -> List(Map(key1 -> 144.0)), 1359 -> List(Map(key2 -> 144.0), Map(key1 -> 144.0)), 1200 -> List(Map(key2 -> 144.0)))


scala> .map { case(i, m) => (i, m reduce (_ ++ _)) }
res11: scala.collection.immutable.Map[Int,Map[String,Double]] = Map(1216 -> Map(key2 -> 148.0, key1 -> 144.0), 1253 -> Map(key1 -> 144.0), 1359 -> Map(key2 -> 144.0, key1 -> 144.0), 1200 -> Map(key2 -> 144.0))y2 -> 148.0)), Map(1200 -> Map(key2 -> 144.0)), Map(1359 -> Map(key2 -> 144.0)))