我正在开发一个需要使用树数据结构的项目。做了一些研究之后,我发现Java JTree对我的项目非常有用,但是我偶然发现了一个问题,我花了一周时间修复但无济于事。
这就是问题,为了创建一个新节点,必须实例化DefaultMutableTreeNode,我不确定如何在循环中完成。通常,当我们想在JTree中创建一个新节点时,我们首先按以下方式声明节点:
DefaultMutableTreeNode parent = new DefaultMutableTreeNode("This is parent node.");
DefaultMutableTreeNode child = new DefaultMutableTreeNode("This is child node.");
然后,为了将子节点添加/链接到父节点,我们将执行以下操作:
parent.add(child);
我有两个包含父节点和子节点的arraylists,它们在父子关系中相互对应,这意味着arraylistParent.get(x)将始终是arraylistChild.get(x)的父节点。
我在想通过使用for循环,我可以这样做:
for (int x = 0; x < arraylistParent.size(); x++){
parent.add(new DefaultMutableTreeNode(arraylistChild.get(x)));
}
这只能在平面层次结构树中工作,显然对我来说并非如此。我将在arrayListParent中有不同的父节点,我需要在添加子节点之前检查它们,但是并非所有子节点都具有相同的单父节点。我的arraylists可能包含这样的东西:
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)相同,但只会检查并添加匹配字符串“This is parent node”的那些。 / p>
如果在循环中找到一个不同的,不存在的父项,则需要创建一个新的父项,这是我不知道如何解决的棘手部分,因为我不知道如何自动循环为子节点创建一个新的父实例。
答案 0 :(得分:2)
让我们假设您的节点数据是字符串(即,ArrayLists的内容是字符串)。但是,该解释适用于任何其他Java对象。我们将这些内容称为“节点”,与“树节点”不同。
您可以创建HashMap<String, DefautMutableTreeNode> m
,以便m.get(node)
返回相应的TreeNode
。
现在,你必须迭代父母的arraylist。在每个职位,您将有一个父母和一个孩子。在地图中查找它们。如果父TreeNode不存在,您首先必须创建它。如果子TreeNode不存在,则同样适用。您应该确保在创建任何TreeNode后更新地图。最后,您将孩子标记为父母的孩子。
在此算法结束时,您应该查看子数组中的所有节点。没有父母的那个是根。这是你树的根。