java - 使用嵌套的 HashMap 是一种不好的做法吗?

标签 java data-structures hashmap

让我解释一下我的情况。我有一些需要维护的层次结构。在下面找到显示此层次结构的图像。我会在图片后解释。

   A
   |          +--> A1.1 ---> X
   |          | 
   +--> A1 ---+--> A1.2 ---> Y
   |          |
   |          .
   +--> A2    .
   .
   .
  • AA1,A2...一对多关系
  • A1A1.1,A1.2...一对多关系
  • A1.1XA1.2Y是一个对一个关系。

最初我设计它的方式是使用多个 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/

相关文章:

c - 在编写用于合并两个已排序链表的代码时获取地址错误的运行时负载

具有字符串索引的 Python 2 维数组(矩阵)

java - HashMap 有什么问题?

java - 我在这里做错了什么(Java)十进制到二进制

java - Antlr4 解析 TreeView 保持为空

java - 如何知道已经创建并运行了多少个线程?

java - 如何对 HashMap 的所有键进行循环?

java - 有没有办法在不添加 throws 声明的情况下抛出异常?

c - 在C中合并多个整数范围的数据结构和算法

Java HashMap关联多维数组无法创建或添加元素