一.引言
构建 key-value 的 map 时有时也需要同时构建 value-key 的 map,所以需要翻转原始的 key-value map,记录一下几种方法。
val infoMap = Map("1" -> "A", "2" -> "B", "3" -> "C", "4" -> "A")
二.翻转 Map
1.For + Yield
val reverseMapV1 = for ((key, value) <- infoMap) yield (value, key)
Map(A -> 4, B -> 2, C -> 3)
for + yield 可以循环生成元素,不过 yield 平常使用场景不多,可以参考 Yield 常用语法
2.Values + KeySet
val reverseMapV2 = infoMap.values.zip(infoMap.keySet).toMap
Map(A -> 4, B -> 2, C -> 3)
key-value 转换为 value-key 再 toMap
3.Map
val reverseMapV3 = infoMap.map(kv => {
(kv._2, kv._1)
})
Map(A -> 4, B -> 2, C -> 3)
和方法二思路类似
Tips:
A.原始 map 中可能存在不同 key 相同 value 的情况,翻转后会造成一个 value 两个 key,此时保存排序靠后的一对 value-key。
B.上述方法得到的 map 均为不可变 map 无法再添加新值,如果需要转换为可变 map 可以执行:
val immu2mu = scala.collection.mutable.HashMap(immutableMap.toSeq:_*)