【问题标题】:Groovy way of transforming a key->values map into value->keys将 key->values 映射转换为 value->keys 的 Groovy 方法
【发布时间】:2019-06-17 08:17:58
【问题描述】:

我正在尝试想出一种方法来从值列表中生成键。

例如:我有这张地图[ a: [1, 2], b: [1, 3, 4] ]

我想把它转换成[ 1: [a, b], 2: [a], 3: [b], 4: [b] ]

基本上我要求How to transform key/value in Map 的常规版本。

到目前为止,我的解决方案有点过分,因为我收集了所有值并创建了新的值键对:

def m = [ a: [1, 2], b: [1, 3, 4] ]
def transformed = m.collectMany { k, v -> v }.collectEntries { v -> [ v, [] ] }
m.collectMany { k, v -> v.collect { vi -> [ vi, k ] } }.each { v, k ->
  transformed[v] += k
}
transformed

有没有更好的方法来实现这种转变?

【问题讨论】:

    标签: groovy


    【解决方案1】:

    您可以在空白地图上使用 injectwithDefault 这样做:

    def m = [a: [1, 2], b: [1, 3, 4]]
    
    m.inject([:].withDefault {[]}) { map, value ->
        value.value.each { map[it] << value.key }
        map
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多