如何将映射的键集与每个列表元素合并:Scala

如何将映射的键集与每个列表元素合并:Scala,scala,functional-programming,Scala,Functional Programming,我有一个类似列表的地图列表(map1、map2、map3) 另一张地图(字符串,字符串)说。。以下示例中指定为外部的映射(字符串,字符串): 我希望名为“outer”的映射的键作为键,并将其映射到列表中的m1映射。这意味着我需要一个1对1的映射,在外映射的键和列表中的映射之间 val m1 = Map("id"->"int", "firstname"->"String", "lastname"->"String") val m2 = Map("Address"->"Str

我有一个类似列表的地图列表(map1、map2、map3) 另一张地图(字符串,字符串)说。。以下示例中指定为外部的映射(字符串,字符串):

我希望名为“outer”的映射的键作为键,并将其映射到列表中的m1映射。这意味着我需要一个1对1的映射,在外映射的键和列表中的映射之间

val m1 = Map("id"->"int", "firstname"->"String", "lastname"->"String")
val m2 = Map("Address"->"String", "Salary"->"Int")
val m3 = Map("Mobile" -> "Int", "email"->"String", "landline"->"int")

val listMap = List(m1,m2,m3)

val outer = Map("test1" -> "location_1", "test2" -> "location_2", "test3" -> "location_3")

val res = outer.map(out => listMap.map(inner => (out._1,inner)))

res.foreach(println)
这将生成如下输出:(我不想要)

我想要的是:

Map(test1 -> map1, test2 -> map2, test3 -> map3)

我怎样才能做到这一点呢?..

地图没有保留顺序,所以我认为这在您的设置中是不可能的。这个怎么样

val output: Map[String, Map[String, String]] = listMap.zipWithIndex
  .map { case (map, i) => s"test${i + 1}" -> map } (collection.breakOut)

我之所以能够做到这一点,是因为:

val newMap = outer.zipWithIndex.map{
      x => (x._1._1, listMap.zipWithIndex.apply(x._2)._1)
    }

    newMap.map(println)

不保证在所有情况下都能工作
Map
没有固有的顺序,因此
zipWithIndex()
将以不同的方式处理不同大小和/或键值的映射。它在这个例子中起作用的事实或多或少是一个意外。有没有更好的方法可以保证….?一个选择可能是使用
ListMap
而不是
Map
。ListMap维护其元素的顺序。从:“…遍历方法按第一次插入的顺序访问键值对。”
val newMap = outer.zipWithIndex.map{
      x => (x._1._1, listMap.zipWithIndex.apply(x._2)._1)
    }

    newMap.map(println)