【发布时间】:2019-12-12 12:22:24
【问题描述】:
我用这个例子来 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);
}
我不想为每个值创建一个新对象,而是始终创建一个 new HashMap,我可以在其中存储节点属性。
我通过访问 JCR 数据存储中的节点并提取它们的值和属性来接收我的数据结构。这就是我生成的数据结构在输出 yaml 文件中的外观:
我怎样才能更有效地做到这一点?
【问题讨论】:
-
为什么不采用像 JSON 这样的行业标准呢?
-
我认为我需要为snakeyaml转储(bitbucket.org/asomov/snakeyaml/wiki/…)构建一个映射结构。
-
你不需要map结构,它只是作为一个例子(比如
List<Integer>)。如果你已经有了类结构,你应该可以直接序列化它。即使你想要一个特定的结构,我也建议不要创建你自己的机制。 -
我确实有类结构,但据我了解,我需要先将其存储在内存中的对象中,然后才能使用snakeyaml 转储它。这就是为什么我试图将它存储在嵌套的地图结构中。不好意思,我不明白你说的直接序列化是什么意思?
-
因此您实际上不需要嵌套地图,您需要将一些数据转储为 YAML。现在你要找到问题的根源了。我建议阅读snakeyaml 文档以了解如何分段编写文件,您只是在浪费时间尝试先将内容转换为地图。