我是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.id
或data.owner.id
或fname
这样的钥匙。因此,密钥路径的长度可以是任意数字。上面的例子是4
,3
和1
。它可以是 5、6 或 7 个任意。键是动态的,所以我无法预测达到最后一个键值的长度。
有没有办法动态拉取哈希图值,如下所示的列表 myHashMaoVariable.get("data.owner.owner.id");
现在我将密钥data.owner.id
拆分为列表和检查
if key[0] > 1 and myHashMaoVariable.containsKey(key[0]),
if key[1] > 1 and myHashMaoVariable.get(key[0]).containsKey(key[1]),
if key[2] > 1 and myHashMaoVariable.get(key[0]).get(key[1]).containsKey(key[1]),
依此类推,直到密钥长度 5。
有没有更好的方法来支持n个键路径长度?此外,嵌套映射也没有depth
。它也是动态的。
假设你有一个顶级地图:
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