让我解释一下我的情况。我有一些需要维护的层次结构。在下面找到显示此层次结构的图像。我会在图片后解释。
A
| +--> A1.1 ---> X
| |
+--> A1 ---+--> A1.2 ---> Y
| |
| .
+--> A2 .
.
.
- 从
A
到A1,A2...
是一对多关系 - 从
A1
到A1.1,A1.2...
是一对多关系 - 从
A1.1
到X
和A1.2
到Y
是一个对一个关系。
最初我设计它的方式是使用多个 HashMap
来维护它。但后来我很快意识到更新成为一项极其艰巨的工作。
拥有多个 HashMap
意味着我必须自己处理不同关系之间的唯一性。例如,A1.1
也可以存在于根 B
节点中。所以我必须将 A
附加到 A1.1
以确保唯一性。现在,如果我必须修改值 A
那么我就有大麻烦了,因为我已经使用它来将 A
中的所有键限定为 A_A1.1
现在我想我可以为此使用嵌套 HashMaps
。所以代码变成了:
HashMap<String, HashMap<String, HashMap<String, CustomObject>>> _worldsBiggestHash;
这种做法可以吗?我确实有很多簿记工作要做,因为我将使用嵌套哈希,但至少 CRUD 和唯一性问题会自行处理。
如果这不行,有人可以建议我可以使用的另一种更好的结构吗?
最佳答案
您显然想为一棵树建模。此树不一定与 TreeMap
明确相关。诚然,我看不出 TreeMap
如何帮助表示整个 结构(尽管它可以用于单个树节点)。
你可以像这样创建一个类
class Node
{
private final String name;
private final Map<String, Node> children;
private final CustomObject customObject;
Node(String name, CustomObject customObject)
{
this.name = name;
this.children = new LinkedHashMap<String, Node>();
this.customObject = customObject;
}
String getName()
{
return name;
}
void addChild(Node child)
{
children.put(child.getName(), child);
}
void removeChild(String name)
{
children.remove(name);
}
Node getChild(String name)
{
return children.get(name);
}
Set<Node> getChildren()
{
return Collections.unmodifiableSet(
new LinkedHashSet<Node>(children.values()));
}
(只是一个速写)
然后你可以像这样构建层次结构
Node root = new Node("", null);
Node a1 = new Node("A1", null);
Node a2 = new Node("A2", null);
root.addChild(a1);
root.addChild(a2);
Node a11 = new Node("A11", x);
Node a12 = new Node("A12", y);
a1.addChild(a11);
a1.addChild(a12);
这已经允许您在层次结构中导航,并且维护关系将非常容易。
我没有完全理解你所说的“唯一性”。无论如何,在这样的树中,每个节点都由路径 唯一标识。您甚至可以创建一个实用方法,例如
CustomObject c = root.find("A", "A1", "A11");
通过节点名称序列快速访问对象。
旁白:正如已经指出的那样,深度嵌套的映射(或列表或集合)是有问题的。但无论如何,您应该始终使用接口(interface),例如
Map<String, Map<String, CustomObject>> maps;
对于某些用例,这可能是可行的,但取决于您想要建模的确切内容(特别是,当有另一层时),这可能已经不方便。
关于java - 使用嵌套的 HashMap 是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587969/