1

我正在做一个需要使用树数据结构的项目。做了一些研究后,我发现 Java JTree 对我的项目很有用,但是我偶然发现了一个问题,我花了一周时间修复但无济于事。

这是问题所在,为了创建一个新节点,必须实例化 DefaultMutableTreeNode ,我不确定如何在循环中完成。通常当我们想在 JTree 中创建一个新节点时,我们会首先通过以下方式声明节点:

DefaultMutableTreeNode parent = new DefaultMutableTreeNode("This is parent node.");
DefaultMutableTreeNode child = new DefaultMutableTreeNode("This is child node.");

然后,为了将子节点添加/链接到父节点,我们将执行以下操作:

parent.add(child);

我有两个包含父节点和子节点的arraylist,它们以父子关系相互对应,这意味着arraylistParent.get(x) 将始终是arraylistChild.get(x) 的父级。

我在想,通过使用 for 循环,我可以做到:

for (int x = 0; x < arraylistParent.size(); x++){
    parent.add(new DefaultMutableTreeNode(arraylistChild.get(x)));
}

这只能在平面层次结构树中工作,对我来说显然不是这样。我将在 arrayListParent 中有不同的父节点,我需要在添加子节点之前对其进行检查,但同样,并非所有子节点都具有相同的单个父节点。我的数组列表可能包含如下内容:

arraylistParent = [root, p1, p2, p2, p3, p1]
arraylistChild = [p1, p2, p5, p3, p4, p5]

我想生成这样的树结构:

root
  ..p1
    ..p2
      ..p5          
      ..p3
        ..p4
    ..p5

显然,我可以在里面抛出一些 if 循环来检查 parent.getUserObject() 是否与 arraylistParent.get(x) 相同,但只有与字符串“这是父节点”匹配的那些才会被检查和添加。

如果在循环中找到不同的、不存在的父级,则需要创建一个新的父级,这是我不知道如何解决的棘手部分,因为我不知道如何让循环自动创建一个新的子节点的父实例。

4

1 回答 1

2

让我们假设您的节点数据是字符串(也就是说,您的 ArrayList 的内容是字符串)。不过,该解释适用于任何其他 Java 对象。我们将这些内容称为“节点”,与“树节点”不同。

你可以创建一个HashMap<String, DefautMutableTreeNode> m,这样m.get(node)会返回对应的TreeNode

现在,您必须遍历父母的数组列表。在每个位置,您将有一个父母和一个孩子。在地图上查找它们。如果父 TreeNode 不存在,您首先必须创建它。如果子 TreeNode 不存在,则同样适用。您应该确保在创建任何 TreeNode 后更新地图。最后,您会将孩子标记为父母的孩子。

在此算法结束时,您应该查看子数组中的所有节点。无父者为根。这是你树的根。

于 2012-11-08T10:55:41.897 回答