2017-06-18 4 views
1

Je suis nouveau à Jtree et Java. J'ai une structure arborescente comme ceci:Comment puis-je obtenir le nombre de nœuds feuille de tous les nœuds parents dans Jtree Java

-Abcd 
--Efghi 
    ---Pqrst 
    ---Uvwxyz 
    ---Xyza 
    ---Hdwik 
    ---Lmnop 
    ---Bcdef 
--Tqrsp 
    ---Jumak 
    ----Uoaha 
    ----Lobte 
    -----Cshnt 
    ----Karke 

Maintenant, je veux obtenir le nombre de Abcd = 14 (ie comte de tous les enfants de Abcd + 1) De même, Abcd - EFGHI = 7 (ie comte de tous les leafNodes d'Efghi + 1)

Mais je ne suis pas en mesure d'obtenir le nombre. Voici le code:

import java.util.Enumeration; 

import javax.swing.JFrame; 
import javax.swing.JTree; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.TreeNode; 
import javax.swing.tree.TreePath; 

import java.io.*; 
import java.util.*; 

public class treeTest { 
    public treeTest(List<String> somelist) { 

     DefaultMutableTreeNode root = new DefaultMutableTreeNode(somelist.get(0)); 


     DefaultTreeModel model = new DefaultTreeModel(root); 


     JTree tree = new JTree(model); 


     for(int i = 1;i<somelist.size();i++) 
     { 
     buildTreeFromString(model, somelist.get(i)); 
     } 


     // UI 


     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(tree); 
     f.setSize(300, 300); 
     f.setLocation(200, 200); 
     f.setVisible(true); 

     for (int i = 0; i < tree.getRowCount(); i++) { 
     tree.expandRow(i); 
     } 

     DefaultMutableTreeNode rootNode = ((DefaultMutableTreeNode)tree.getModel().getRoot()); 

     int n = tree.getModel().getChildCount(rootNode); 
     System.out.println(n); 


    } 



    private void buildTreeFromString(final DefaultTreeModel model, final String str) { 
     // Fetch the root node 
     DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); 

     // Split the string around the delimiter 
     String [] strings = str.split(" - "); 

     // Create a node object to use for traversing down the tree as it 
     // is being created 
     DefaultMutableTreeNode node = root; 

     // Iterate of the string array 
     for (String s: strings) { 
      // Look for the index of a node at the current level that 
      // has a value equal to the current string 
      int index = childIndex(node, s); 

      // Index less than 0, this is a new node not currently present on the tree 
      if (index < 0) { 
       // Add the new node 
       DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(s); 
       node.insert(newChild, node.getChildCount()); 
       node = newChild; 
      } 
      // Else, existing node, skip to the next string 
      else { 
       node = (DefaultMutableTreeNode) node.getChildAt(index); 
      } 
     } 
    } 


    private int childIndex(final DefaultMutableTreeNode node, final String childValue) { 
     Enumeration<DefaultMutableTreeNode> children = node.children(); 
     DefaultMutableTreeNode child = null; 
     int index = -1; 

     while (children.hasMoreElements() && index < 0) { 
      child = children.nextElement(); 

      if (child.getUserObject() != null && childValue.equals(child.getUserObject())) { 
       index = node.getIndex(child); 
      } 
     } 

     return index; 
    } 

    public static void main(String[] args) throws FileNotFoundException, IOException { 

      List<String> list = new ArrayList<String>(); 
      BufferedReader reader = new BufferedReader(new FileReader("Filepath\Sample.txt")); 
      String line; 
      while ((line = reader.readLine()) != null) { 
      list.add(line); 
     } 
      reader.close(); 

     new treeTest(list); 
    } 
} 

Est-il possible que je puisse obtenir leafcount de tous les parents de l'arbre ou est-il un autre moyen d'obtenir cette information sans utiliser l'arbre?

Répondre

0

Vous pouvez obtenir votre nombre dans l'une des deux façons suivantes:

  1. Pendant que vous construisez les nœuds de JTree, vous pouvez accumuler le nombre que vous cherchez
  2. Une autre approche serait de traverser l'arbre, et puis en utilisant la méthode getChildCount() des node cas, vous pourriez obtenir un compte des nœuds enfants

Hope this helps!

+0

Merci, j'ai traversé l'arbre et j'ai eu le compte –