我有一个分层数据。类似的东西:
以下是特征:
以下是我想要执行的操作:
Tree.get("a.b.d.g")
应该为我提供节点g
Tree.set("a.b.d.g",value)
的值的g
我现在可以想到“hashmap的hashmap”这种数据结构。我总是可以在每个节点上缓存操作3和4的答案。当然,我需要在复制或移动等时清除缓存......
是否有其他实现方法可以在内存占用最少的情况下从上述操作中获得最佳性能。
答案 0 :(得分:0)
对于基本建模,您应该使用复合模式:
public class TreeNode {
private String id;
private TreeNode parent;
private List<TreeNode> treeNodes = new ArrayList<>();
...
}
每个节点都有一个String id,对其父节点的引用,并引用其子节点。 你可以通过迭代getParent()直到它的null(使用递归)来获得最高根。
对于解析路径,想象一下:
public TreeNode get(final String path) {
if (!path.isEmpty()) {
for (TreeNode treeNode : treeNodes) {
if (path.startsWith(treeNode.getId())) {
return treeNode.get(path.substring(...));
}
}
}
return this;
}
现在,如果您正在寻找一种存储此类数据(图形)的方法并对其进行高性能查询,您可以考虑使用图形数据库作为@sebgymn提到:Neo4j是一个很好的数据库,用于java
关于使用NOSQL的连接数据模型。节点将数据存储在属性中,关系也在Neo4j中存储和显式命名,并充当节点之间的链接。然后,您可以在节点上执行查询(属性,与他人的关系......)。
以下是演示文稿的链接:http://fr.slideshare.net/neo4j/data-modeling-with-neo4j
一个很棒的教程:http://technoracle.blogspot.fr/2012/04/getting-started-with-neo4j-beginners.html
执行查询的测试图数据库:http://www.neo4j.org/learn/cypher
例如:您可以尝试在neo4j中实现一个多级模式树(在您的情况下,检查顶部根是很重要的:所以看起来您的模型在树上有不同的级别)。