Scala比较Map值和另一个Map键

时间:2018-11-17 21:34:34

标签: scala

我有两张地图:

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值并获取该值的对应密钥。

1 个答案:

答案 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())
// )