简体   繁体   English

GroupBy 并根据 Scala 中的另一个 map 转换一个 map

[英]GroupBy and transform a map based on another map in Scala

I have a map as follows我有一个 map 如下

val typeMap = Map(
"mk1" -> "m",
"mk2" -> "m1",
"mk3" -> "m2",
"mk4" -> "d",
"mk5" -> "d2",
"mk6" -> "d2",
"mk7" -> "d3",
"mk8" -> "f4"
)

I have another map that defines the group condition我有另一个定义组条件的 map

val groupMap = Map(
"m_type" -> List("m", "m1", "m2"),
"d_type" -> List("d", "d2", "d3"),
"c_type" -> List("c","c1")
)

I need to use the conditions in the groupMap to pick the keys of typeMap whose values are mapped to the types in groupMap to get a new Map as follows我需要使用 groupMap 中的条件来选择 typeMap 的键,其值映射到 groupMap 中的类型以获得新的 Map 如下

Map(
"m_type" -> List("mk1", "mk2", "mk3"),
"d_type" -> List("mk4", "mk5", "mk6", "mk7"),
"c_type" -> List()
)

If your groupMap is guaranteed to have only unique values in all lists you can create a reverse map and use it to group by typeMap values:如果您的groupMap保证在所有列表中只有唯一值,您可以创建一个反向 map 并使用它按typeMap值分组:

val reverseGroupMap = groupMap.flatMap{case (key, value) => value.map(_ -> key)}

typeMap
  .groupBy{case (key, value) =>  reverseGroupMap(value)}
  .map{case (sec, map) => sec -> map.values.toList}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM