gpt4 book ai didi

java - Java 中深度嵌套的 hashmap

转载 作者:行者123 更新时间:2023-12-02 09:12:23 27 4
gpt4 key购买 nike

我用这个例子来 Accessing Deeply nested HashMaps in Java构建数据结构来存储节点名称和属性。

这是更新后的代码:

class NestedMap {

private final HashMap<String, NestedMap> child;

private Map<String, Object> value = new HashMap<>();

public NestedMap() {
child = new HashMap<>();
setValue(null);
}

public boolean hasChild(String k) {
return this.child.containsKey(k);
}

public NestedMap getChild(String k) {
return this.child.get(k);
}

public void makeChild(String k) {
this.child.put(k, new NestedMap());
}

public Map<String, Object> getValue() {
return value;
}

public void setValue(Map<String, Object> value) {
this.value = value;
}

}

我的使用示例:

    class NestedMapIllustration {
public static void main(String[] args) {

NestedMap m = new NestedMap();

m.makeChild("de");
m.getChild("de").makeChild("content");
m.getChild("de").getChild("content").makeChild("00");
m.getChild("de").getChild("content").makeChild("0");
m.getChild("de").getChild("content").makeChild("1");
m.getChild("de").getChild("content").makeChild("01");
m.getChild("de").getChild("content").getChild("01").makeChild("fieldsets");
m.getChild("de").getChild("content").getChild("01").getChild("fieldsets").makeChild("0");
m.getChild("de").getChild("content").getChild("01").getChild("fieldsets").getChild("0").makeChild("fields");
m.getChild("de").getChild("content").getChild("01").getChild("fieldsets").getChild("0").getChild("fields").makeChild("0");
Map<String, Object> properties = new HashMap<>();
properties.put("key", "value");
properties.put("key2", "value");
m.getChild("de").getChild("content").getChild("01").getChild("fieldsets").getChild("0").getChild("fields").setValue(properties);
}

我希望始终创建一个可以存储节点属性的新 HashMap,而不是为每个值创建一个新对象。

我通过访问 JCR 数据存储中的节点并提取它们的值和属性来接收我的数据结构。这就是我生成的数据结构在输出 yaml 文件中的外观:

enter image description here

我怎样才能更有效地做到这一点?

最佳答案

您已经竭尽全力让您使用任何键,但您正在使用字符串键,即使其中一个键是 "01"这表明它是一个数字。

我可以由此得出结论,键总是字符串吗?

在这种情况下,为什么不定义一个分隔符(例如斜杠)并使用普通的旧 TreeMap<String, V> ?然后你可以这样做:

m.put("de/content/01/fieldsets/0/fields", properties);

如果你想要 de/content/01 中的所有内容“树”,你可以这样做:

m.subMap("de/content/01/", "de/content/010");

上面将为您提供一个包含 de/content/01 的每个子级的 map 。 0010 的末尾有一个“魔法”:零是 ascii 表中斜线之后的下一个字符。

如果您希望任何给定的键映射到任意数量的值,您可以使用:

TreeMap<String, List<V>> map = new TreeMap<>();

把东西放进去:

map.computeIfAbsent(key, k -> new ArrayList<>()).add(elem);

并把事情弄清楚:

for (V value : map.getOrDefault(key, List.of())) {
// works even if key isn't in there (loops 0 times then)
}

关于java - Java 中深度嵌套的 hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59304506/

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