如何从Map和嵌套Map中按键搜索值

时间:2016-09-28 13:28:30

标签: groovy

我有Map如下: -

def map = [
        a:"a",
        b:[f:"f", g:"g"],
        c:"c",
        d:"d",
        e:[h:"h", i:[j:"j"]],
    ]

这里我想按给定的密钥搜索值。但问题是提供密钥是单个唯一密钥而不是嵌套密钥层次结构如下: -

println map.a
println map.j

此处按预期输出: -

a
null

正如您所看到的,我无法获得j密钥的价值,我知道因为根Map中没有此密钥,但它存在于嵌套Map中。如果我这样做: -

println map.e.i.j

它给了我正确的输出,但我不知道这种键的层次结构。

有没有办法通过传递精确密钥从map以上获取价值?

注意: - 所提供的Map中的所有密钥始终是唯一的。

1 个答案:

答案 0 :(得分:4)

编写一个简单的树遍历:

def findDeep(Map m, String key) {
    if (m.containsKey(key)) return m[key]
    m.findResult { k, v -> v instanceof Map ? findDeep(v, key) : null }
}

根据您的输入映射,以下测试代码:

('a'..'k').each { key ->
    println "${key}: ${findDeep(map, key)}"
}

产生以下结果:

a: a
b: [f:f, g:g]
c: c
d: d
e: [h:h, i:[j:j]]
f: f
g: g
h: h
i: [j:j]
j: j
k: null