我有两张地图:
val myMap1 = Map(
testKey1 -> List(testValue1, testValue2, testValue3....),
testKey2 -> List(testValue4, testValue5, testValue6....),
testKey3 -> List(testValue7, testValue8, testValue9....)
testKey4 -> List(testValue10, testValue11, testValue12....)
)
val myMap2 = Map(
testValue1 -> List(Value1, Value2, Value3....),
testValue5 -> List(Value4, Value5, Value6....),
testValue10 -> List(Value7, Value8, Value9....)
)
我想通过将Map1值与Map2键匹配来创建第三个Map,
其中Map1键为Key,而Map2值为新的第三个Map的值。
就是这样
val myMap3 = Map(
testKey1 -> List(Value1, Value2, Value3....),
testKey2 -> List(Value4, Value5, Value6....),
testKey4 -> List(Value7, Value8, Value9....)
)
我无法遍历作为列表的Map1值并获取该值的对应密钥。
答案 0 :(得分:2)
您可以通过在第一个地图上使用mapValues
来获取所需的键的每个 List 键,然后使用{{1} }以获取所需的值。
这是一个示例,请注意flatMap
方法,以确保即使键不存在,我们也总是得到一个值。
getOrElse
如果您需要删除具有空值的键,则可以对其进行过滤。
val myMap1 = Map(
"testKey1" -> List("testValue1", "testValue2", "testValue3"),
"testKey2" -> List("testValue4", "testValue5", "testValue6"),
"testKey3" -> List("testValue7", "testValue8", "testValue9"),
"testKey4" -> List("testValue10", "testValue11", "testValue12")
)
val myMap2 = Map(
"testValue1" -> List(1, 2, 3),
"testValue2" -> List(5),
"testValue5" -> List(4, 5, 6),
"testValue10" -> List(7, 8, 9)
)
val myMap3 = myMap1.mapValues {
valuesList => valuesList.flatMap {
valueKey => myMap2.getOrElse(valueKey, List.empty[Int])
}
}
// myMap3: Map[String, List[Int]] = Map(
// testKey1 -> List(1, 2, 3, 5),
// testKey2 -> List(4, 5, 6),
// testKey3 -> List(),
// testKey4 -> List(7, 8, 9)
// )
如果我要创建此myMap3,其中的值将是myMap2的键及其各自的值。
鉴于myMap3.filter { case (_, values) => values.nonEmpty }
的值是myMap1
的键的列表,我认为您真正想要的是myMap2
。
Map[String, Map[String, List[A]]
同样,如果不需要,您可以过滤空值。
val myMap4 = myMap1.mapValues {
valuesList => valuesList.map {
valueKey => valueKey -> myMap2.getOrElse(valueKey, List.empty[Int])
}.toMap
}
// myMap4: Map[String, Map[String, List[Int]]] = Map(
// testKey1 -> Map(testValue1 -> List(1, 2, 3), testValue2 -> List(5), testValue3 -> List()),
// testKey2 -> Map(testValue4 -> List(), testValue5 -> List(4, 5, 6), testValue6 -> List()),
// testKey3 -> Map(testValue7 -> List(), testValue8 -> List(), testValue9 -> List()),
// testKey4 -> Map(testValue10 -> List(7, 8, 9), testValue11 -> List(), testValue12 -> List())
// )