【问题标题】:how to revert the result in hashmap key&value in groovy如何在groovy中恢复hashmap key&value中的结果
【发布时间】:2019-01-30 23:51:30
【问题描述】:

从哈希图“hash1”中,我无法在 groovy 中获得结果“hash2”:

hash1 = [a:['a1','b1','c1'],b:['a1','b1','c1','d1']]

hash2 = [a1:['a','b'],b1:['a','b'],c1:['a','b'],d1:['b']]

你能帮忙吗?

莫里斯

【问题讨论】:

  • 你试过什么?请分享这样的代码,以便我们改进它。
  • 我想反转哈希键和值,以便将 hash1 中的每个值更改为 hash2 中的键。 hash2 中的键将 hash1 中的旧键关联为值。拥有解决方案非常重要。如果您需要更多信息,请询问我。例如在 hash1 中:a 是键,a1 是值 / 在 hash2 中:a1 是键,a 是值,.....

标签: list groovy hashmap


【解决方案1】:

注意,我在其中一个地图值中添加了一个重复项 (a1),以展示如何消除重复项以防万一。如果您仍想保留重复项,则只需从以下方法中删除 .unique()

def map = [a:['a1','b1','c1','a1'],b:['a1','b1','c1','d1']]

map.inject([:].withDefault { [] }) { acc, key, val ->
  val.collect { (acc[it] << key).unique() }
  acc
}

// [a1:[a, b], b1:[a, b], c1:[a, b], d1:[b]]

【讨论】:

  • 你可以像这样解构 Map$Entry,但不能解构 List
【解决方案2】:

您可以收集第一张地图的反转元组。然后要么按第一个元素对它们进行分组并收集列表,要么只是减少。例如:

def hash1 = [a:['a1','b1','c1'],b:['a1','b1','c1','d1']]

println(
    hash1.collectMany{ k, vs -> 
        vs.collect{ [it, k] } 
    }.inject([:].withDefault{[]}){ m, t -> 
        m[t[0]] << t[1]; m
    }
)
// => [a1:[a, b], b1:[a, b], c1:[a, b], d1:[b]]

【讨论】:

  • 太棒了!非常感谢!
猜你喜欢
  • 2012-12-08
  • 2012-06-30
  • 2012-06-09
  • 1970-01-01
  • 2011-05-19
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
相关资源
最近更新 更多