создание JTree из кучи - PullRequest
       4

создание JTree из кучи

4 голосов
/ 11 ноября 2010

Настройка


У меня есть куча с intLevels уровнями и e элементами (обоими int с), хранящимися в двумерном массиве Object с, 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) с, это выглядело бы так:

[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-массив в JTree с заданной информацией?При правильной реализации ввод значений 1, 2, 3, 4, 5, 6, 7, 8 и 9 в это дерево / кучу / массив должен привести к тому же результату, что и конкретный способ, который я показал выше.

1 Ответ

1 голос
/ 11 ноября 2010

Этот класс должен сделать свое дело. Я использовал рекурсию, чтобы разрешить любое количество дочерних уровней (при условии, что имеется достаточно массивов объектов и объектов для поддержки дерева).

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
...