代码之家  ›  专栏  ›  技术社区  ›  Ky -

从堆创建JTree

  •  4
  • Ky -  · 技术社区  · 14 年前

    安装程序


    我有一堆 intLevels 水平和 e 元素(两者 int s)存储在 Object s,希帕雷,这是 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);
    

    它似乎仍然不起作用;树仍然是空的。

    问题


    有没有人知道一个相对容易但灵活的方式使这个2D数组成为一个JTURE与给定的信息?如果实现正确的话,将1、2、3、4、5、6、7、8和9输入到这个树/堆/数组的结果应该与我上面展示的具体方法相同。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Jason    14 年前

    这门课应该能做到。我使用递归允许任意数量的子级别(假设有足够的对象数组和对象来支持树)。

    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
    
    推荐文章