Creating JTree from a heap

Customization


I have a bunch with intLevels and e levels (both int s) that are stored in the Object s 2D array, heapArray, which intLevels tall and Math.pow(2, intLevels) wide. For hypothetical purposes, let's say I enter 1, 2, 3, 4, 5, 6, 7, 8, and 9. The heap will look something like this:

  9 8 6 7 3 2 5 1 4 

and if you were to print it with a series of java.util.Arrays.toString(Object[] a) s, it would look like this:

 [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] 

Does anyone know how to take this information and create a JTree? For those who don’t know, JTree is very similar to a linked list. You have a root node to which you add more nodes, and you can add additional nodes to them. I know that if the only heap I had to deal with was this one, I could make a tree this way:

 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)); 

resulting in a tree as follows:

 9 β”œ8 β”‚β”œ7 β”‚β”‚β”œ1 β”‚β”‚β””4 β”‚β””3 β””6 β”œ2 β””5 

Edit


I found an implemented response method buildTree(List<Object[]>) :

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

it still does not work; the tree remains empty.

Question


Does anyone know a relatively simple but flexible way to make this 2D array in JTree with this information? If they are executed correctly, entering 1, 2, 3, 4, 5, 6, 7, 8, and 9 into this tree / heap / array should end with the same result as the specific method shown above.

+4
source share
1 answer

This class should do the trick. I used recursion to allow any number of child levels (provided that arrays of objects and objects are enough to support the tree).

 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; } } 

Results:

 9 8 7 1 2 3 6 2 5 
+1
source

All Articles