scala - Scala 将 Map 值与另一个 Map 键进行比较
问题描述
我有两个地图:
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 键将是键,Map2 值将是这个新的第三个 Map 的值。
会是这样
val myMap3 = Map(
testKey1 -> List(Value1, Value2, Value3....),
testKey2 -> List(Value4, Value5, Value6....),
testKey4 -> List(Value7, Value8, Value9....)
)
我无法遍历作为列表的 Map1 值并获取该值的相应键。
解决方案
您可以通过mapValues
在第一个Map上使用来获取每个值的键列表,然后flatMap
在此 lis 上使用来获取所需的值,从而获得所需的内容。
这是一个例子,请注意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.filter { case (_, values) => values.nonEmpty }
编辑
如果我想创建这个 myMap3,其中的值将是 myMap2 的键和它们各自的值。
鉴于 的值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())
// )
同样,如果不需要它们,您可以过滤空值。
val myMap5 = myMap1.mapValues {
valuesList => valuesList.flatMap { // here we use flatMap, to filter any None.
valueKey => myMap2.get(valueKey).map(values => valueKey -> values)
}.toMap
} filter {
case (_, values) => values.nonEmpty
}
// myMap5: Map[String, Map[String, List[Int]]] = Map(
// testKey1 -> Map(testValue1 -> List(1, 2, 3), testValue2 -> List(5)),
// testKey2 -> Map(testValue5 -> List(4, 5, 6)),
// testKey4 -> Map(testValue10 -> List(7, 8, 9))
// )
推荐阅读
- excel - 如何使用vba打开名称更改的excel工作簿
- javascript - 过滤2个数组看是否有重复
- sql - SQL:仅对不同的值求和
- python - 使用 matplotlib 绘制堆积条形图,保持 pandas 数据框的顺序,因为它使用 python
- nuget - Nuget 错误:解析值时遇到意外字符:<。路径 '',第 0 行,第 0 位置
- highcharts - Highchart 放大后工具提示中显示不同的点以显示 simmer 值
- angular - 发送表单数据类型请求时出现 400 HTTP 错误
- c# - OnPropertyChange 导致 Xamarin.Forms Android 上的死锁
- angular - 如何直接从 Angular 11 调用 Zoom 的 REST-API?
- python - 从文件夹中的文件创建多个数据框