如何从 Map 和 Nested Map 中按键搜索值

Sau*_*aur 1 groovy

我有一个Map如下: -

def map = [
        a:"a",
        b:[f:"f", g:"g"],
        c:"c",
        d:"d",
        e:[h:"h", i:[j:"j"]],
    ]
Run Code Online (Sandbox Code Playgroud)

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

println map.a
println map.j
Run Code Online (Sandbox Code Playgroud)

这里按预期输出:-

a
null
Run Code Online (Sandbox Code Playgroud)

如您所见,我无法获取j键的值,我知道是因为此键不存在于 root 中,Map但存在于 nested 中Map。如果我这样做: -

println map.e.i.j
Run Code Online (Sandbox Code Playgroud)

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

有没有办法map只通过传递精确的键来从上面获取价值?

注意:- 所有密钥在提供的Map.

Bal*_*Rog 5

写一个简单的树遍历:

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

给定您的输入地图,以下测试代码:

('a'..'k').each { key ->
    println "${key}: ${findDeep(map, key)}"
}
Run Code Online (Sandbox Code Playgroud)

产生以下结果:

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
Run Code Online (Sandbox Code Playgroud)