gpt4 book ai didi

java - 嵌套 Java HashMap 的动态变量键

转载 作者:行者123 更新时间:2023-12-02 11:43:49 25 4
gpt4 key购买 nike

我是java新手。

我需要使用其键路径从Nested HashMap获取HashMap值,并且键是一个动态变量。

例如 HashMap 是

{data={
"owner" : {
"id" : 34,
"firstName" : "John",
"lastName" : "Smith",
"owner" : {
"id" : 44,
"firstName" : "Henrick",
"lastName" : "kane"
},
},
"fname" : "sahal",
"lname" : "kn",
}
}

我得到了诸如 data.owner.owner.iddata.owner.idfname 之类的 key 。所以关键路径的长度可以是任意数字。上面的例子是 431。可以是 5、6 或 7 个任意值。键是动态的,因此我无法预测达到最后一个键值的长度。

有没有办法可以动态提取 HashMap 值,如下所示myHashMaoVariable.get("data.owner.owner.id");

现在我将 key data.owner.id 拆分到一个列表并检查
如果 key[0] > 1 且 myHashMaoVariable.containsKey(key[0]),
如果 key[1] > 1 且 myHashMaoVariable.get(key[0]).containsKey(key[1]),
如果 key[2] > 1 且 myHashMaoVariable.get(key[0]).get(key[1]).containsKey(key[1]),
依此类推,直到 key 长度为 5。

是否有更好的方法来支持 n 个关键路径长度?嵌套 map 也没有深度。它也是动态的。

最佳答案

假设您有一个顶级 map :

Map<String, Object> rootMap = ...//obtain map

您可以定义一个动态读取特定级别值的方法:

static Object readKeyValue(String keyPath, Map<String, Object> root) {

String[] keys = keyPath.split("\\.");
Object value = root.get(keys[0]);
for (int i = 1; i < keys.length; i++) {
if (i == keys.length - 1) {
return ((Map<String, Object>) value).get(keys[i]);
} else {
value = ((Map<String, Object>) value).get(keys[i]);
}
}

return value;
}

使用这样的方法,您可以通过以下方式调用它:

Object value = readKeyValue("data.owner.owner.id", rootMap);

使用以下主要方法进行测试:

public static void main(String[] args) {

Map<String, Object> rootMap = new HashMap<>(), data = new HashMap<>(), owner1 = new HashMap<>(),
owner2 = new HashMap<>();

rootMap.put("data", data);
data.put("owner", owner1);
owner1.put("owner", owner2);
owner2.put("firstName", "something");

System.out.println(rootMap);
System.out.println(readKeyValue("data.owner.owner.firstName", rootMap));
}

并产生以下输出:

{data={owner={owner={firstName=something}}}}
something

关于java - 嵌套 Java HashMap 的动态变量键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48353194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com