gpt4 book ai didi

java - 从堆创建 JTree

转载 作者:搜寻专家 更新时间:2023-11-01 03:44:52 25 4
gpt4 key购买 nike

设置


我有一个 intLevels 的堆水平和 e元素(均为 int s)存储在 Object 的二维数组中s,heapArray,即intLevels高大Math.pow(2, intLevels)宽的。出于假设目的,假设我输入 1、2、3、4、5、6、7、8 和 9。堆看起来像这样:

       9
8 6
7 3 2 5
1 4

如果你用一系列 java.util.Arrays.toString(Object[] a) 来打印它s,它看起来像这样:

[9, null, null, null, null, null, null, null]
[8, 6, null, null, null, null, null, null]
[7, 3, 2, 5, null, null, null, null]
[1, 4, null, null, null, null, null, null]

有没有人知道如何获取这些信息并从中创建 JTree?对于不知道的人来说,JTree 的工作方式很像链表。您有一个根节点,您可以向其添加更多节点,并且可以在这些节点上添加其他节点。我知道一个事实,如果我正在处理的唯一堆是这个,我将能够以这种方式制作树:

jTree = new javax.swing.JTree();

treeNode1 = new javax.swing.tree.DefaultMutableTreeNode(9);
treeNode2 = new javax.swing.tree.DefaultMutableTreeNode(8);
treeNode3 = new javax.swing.tree.DefaultMutableTreeNode(7);
treeNode4 = new javax.swing.tree.DefaultMutableTreeNode(1);
treeNode3.add(treeNode4);
treeNode4 = new javax.swing.tree.DefaultMutableTreeNode(4);
treeNode3.add(treeNode4);
treeNode2.add(treeNode3);
treeNode3 = new javax.swing.tree.DefaultMutableTreeNode(3);
treeNode2.add(treeNode3);
treeNode1.add(treeNode2);
treeNode2 = new javax.swing.tree.DefaultMutableTreeNode(6);
treeNode3 = new javax.swing.tree.DefaultMutableTreeNode(2);
treeNode2.add(treeNode3);
treeNode3 = new javax.swing.tree.DefaultMutableTreeNode(5);
treeNode2.add(treeNode3);
treeNode1.add(treeNode2);
jTree.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));

这导致一棵树看起来像:

9
├8
│├7
││├1
││└4
│└3
└6
├2
└5

编辑


我发现实现了答案的 buildTree(List<Object[]>)方法:

java.util.List<Object[]> objectArrays = new java.util.ArrayList<Object[]>();
objectArrays.addAll(Arrays.asList(heapArray));
jTree1 = buildTree(objectArrays);

似乎还是不行;树仍然是空的。

问题


有谁知道用给定的信息将这个二维数组制作成 JTree 的相对简单而灵活的方法?如果正确实现,将 1、2、3、4、5、6、7、8 和 9 输入到此树/堆/数组中,最终结果应该与我上面显示的具体方法相同。

最佳答案

这个类应该可以解决问题。我使用递归来允许任意数量的子级别(假设有足够的对象数组和对象来支持树)。

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class TreeBuilder {

public static void main(final String[] args) {

// build the list of object arrays
List<Object[]> objectArrays = new ArrayList<Object[]>();
Object[] array1 = {9, null, null, null, null, null, null, null};
Object[] array2 = {8, 6, null, null, null, null, null, null};
Object[] array3 = {7, 3, 2, 5, null, null, null, null};
Object[] array4 = {1, 2, null, null, null, null, null, null};
objectArrays.add(array1);
objectArrays.add(array2);
objectArrays.add(array3);
objectArrays.add(array4);

// call the method under test
JTree result = buildTree(objectArrays);

// print the results
if(result == null) {
System.out.println("FAIL: returned null.");
} else {
recursePrintTree((DefaultMutableTreeNode)result.getModel().getRoot(), 0);
}
}


public static void recursePrintTree(
final DefaultMutableTreeNode treeNode,
final int indentation) {

// print the indentation spaces
for(int index = 0; index < indentation; index++) {
System.out.print(" ");
}
// print the value of the node
System.out.println(treeNode.getUserObject());

// enumerate the children of the node
Enumeration enumeration = treeNode.children();
while(enumeration.hasMoreElements()) {
DefaultMutableTreeNode child =
(DefaultMutableTreeNode)enumeration.nextElement();
recursePrintTree(child, indentation + 1);
}
}


public static JTree buildTree(final List<Object[]> objectArrays) {
JTree jTree = new JTree();

DefaultMutableTreeNode node = recurseBuildTree(objectArrays, 0, 0);
if(node != null) {
jTree.setModel(new DefaultTreeModel(node));
}

return jTree;
}


private static DefaultMutableTreeNode recurseBuildTree(
final List<Object[]> objectArrays,
final int objectArrayIndex,
final int itemIndex) {

DefaultMutableTreeNode node = null;

if(objectArrayIndex < objectArrays.size()) {
Object[] objectArray = objectArrays.get(objectArrayIndex);
if(itemIndex < objectArray.length) {
Object obj = objectArray[itemIndex];
if(obj != null) {
node = new DefaultMutableTreeNode(obj);

DefaultMutableTreeNode childNode = recurseBuildTree(
objectArrays, objectArrayIndex + 1, itemIndex * 2);

if(childNode != null) {
node.add(childNode);
}

childNode = recurseBuildTree(
objectArrays, objectArrayIndex + 1, (itemIndex * 2) + 1);

if(childNode != null) {
node.add(childNode);
}
}
}
}

return node;
}

}

结果是:

9
8
7
1
2
3
6
2
5

关于java - 从堆创建 JTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4151374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com