我有一个带有DefaultTreeModel的JTree。我需要到达它的每个节点。
想象一下,我有这棵树:
[A]
|-[B]
|-[C]
|-[D]
| |-[E]
| |-[F]
| |-[G]
| |-[H]
|-[I]
|-[J]
|-[K]
我需要遍历它并打印出来:
---[A]---
>[B]
>[C]
>---[D]---
>>---[E]---
>>>[F]
>>>[G]
>>>[H]
>>+++[E]+++
>+++[D]+++
>[I]
>[J]
>[K]
---[A]---
所以,我正在使用
java.util.Enumeration en = root.preorderEnumeration();
while (en.hasMoreElements()) {}
但我无法想出一个有效的功能。我需要在启动节点时输入 --- NODE NAME --- 并使用 +++ NODE NAME +++ 结束节点,我无法做到这一点。如果只有一个父节点不是另一个父节点的最后一个元素,我的工作到了一定程度。但是当最后一个节点也是父节点时它会中断。任何帮助将不胜感激。
修改
现在我注意到它甚至没有像我想的那样工作。这是我目前的输出:
----root (81)----
name
time
displaySize
----New Group1----
BaseX
BaseY
----New Group2----
BaseRadius
----New Group3----
Angle
DistanceFromCenter
++++New Group3++++
PlayerSpeed
MouseX
MouseY
++++New Group3++++
PlayerX
PlayerY
BonusSpawned
actorTags
++++New Group3++++
BonusTime
BonusWhich
+++root+++
EDIT2:
while (en.hasMoreElements()) {
nodeTemp = node;
node = (DefaultMutableTreeNode) en.nextElement();
String nodeName = node.toString();
if (node.getChildCount() > 0) {
System.out.println("---" + nodeName + "---");
} else {
if (nodeTemp.getChildCount() == 0 && nodeTemp.getParent() != node.getParent()) {
System.out.println("+++" + nodeName + "+++");
loopCount++;
}
System.out.println(nodeName);
}
loopCount++;
}
答案 0 :(得分:3)
我通过抛弃枚举并构建我自己的函数来解决它:
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
printNode(root);
public void printNode(DefaultMutableTreeNode node) {
int childCount = node.getChildCount();
System.out.println("---" + node.toString() + "---");
for (int i = 0; i < childCount; i++) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i);
if (childNode.getChildCount() > 0) {
printNode(childNode);
} else {
System.out.println(childNode.toString());
}
}
System.out.println("+++" + node.toString() + "+++");
}
答案 1 :(得分:2)
使用递归你可以做类似这样的psuedocode
修改我的递归方法版本
public static void print(DefaultMutableTreeNode aNode)
{
String name = aNode.toString();
int level= aNode.getLevel();
String placement = "";
while (level > 0)
{
placement += ">";
level--;
}
if(aNode.isLeaf())
{
System.out.println(placement + name);
return;
}
System.out.println(placement + "--- " + name + " ---");
for(int i = 0 ; i < aNode.getChildCount() ; i++)
{
print((DefaultMutableTreeNode)aNode.getChildAt(i));
}
System.out.println(placement + "+++ " + name + " +++");
}
这会给你&gt;对于水平也例如我的输出是:
--- A ---
>--- B ---
>>C
>>--- D ---
>>>E
>>+++ D +++
>+++ B +++
>F
>G
>H
+++ A +++
答案 2 :(得分:-2)
Websearch“深度第一树步行”和/或“广度第一树步行”。前者更常见,但后者有应用。
如果树节点是双向链接的(如果节点可以到达父节点和子节点),则存在深度优先解决方案,其唯一状态是当前节点。否则,你需要维护一个堆栈(作为一个数据结构,或者通过递归步行),这样你就可以在一个分支的给定级别用尽兄弟姐妹后重新开始。