Member 13265840 Ответов: 1

Как я могу получить количество листовых узлов всех родительских узлов в jtree java


Я новичок в Jtree и Java.

Итак, у меня есть такая древовидная структура :

-АБВГД
--Efghi
---Pqrst
---Uvwxyz
---Ксиза
--- Hdwik
---Lmnop
--- Bcdef
--Tqrsp
--- Джумак
----Уоаха
---- Лобте
-----Cshnt
---- Карк

Теперь я хочу получить количество Abcd = 14 (то есть количество всех потомков Abcd+1) аналогично, Abcd-Efghi = 7 (то есть количество всех листовых узлов Efghi+1)

Но я не могу получить счет. Вот код :

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


Есть ли какой-нибудь способ получить количество листьев каждого родителя в дереве или есть какой-то другой способ получить эту информацию без использования дерева?

Что я уже пробовал:

Я пробовал создать Jtree.

Patrice T

Я бы не стал использовать дерево для этой задачи, оно просто усложняет ситуацию.

Member 13265840

Тогда что же мне делать, вы можете мне помочь

1 Ответов

Рейтинг:
0

Patrice T

ppolymorphe писал:
Я бы не стал использовать дерево для этой задачи, оно просто усложняет ситуацию.

Цитата:
Тогда что же мне делать, вы можете мне помочь

Это вопрос "проблемного анализа": вы мочь постройте дерево, но нужно ли вам это ?
Как вы уже выяснили, вам нужно читать строки 1 на 1
while ((line = reader.readLine()) != null) {
  // your code for a line goes here.
}

Когда у вас есть эта строка: "Abcd - Tqrsp-Jumak-Lobte"
Вы должны подсчитать, сколько раз вы видели каждую подстроку как:
"Abcd-Tqrsp-Jumak-Lobte"
"Abcd-Tqrsp-Jumak"
"Abcd-Tqrsp"
"Азбука"
Когда вы получаете строки, вам нужно запомнить каждую пару строк (ключ) и счетчик.
Самое простое решение-это массив для ключей и массив для счетчиков, он не будет хорошо масштабироваться, но сделает то, что вам нужно.
Для более эффективного решения некоторые языки имеют ассоциативные массивы, а Java-ассоциативные массивы. hashmaps.

Как получить каждую подстроку ?
вы уже используете split:
// Split the string around the delimiter
String [] strings = str.split(" - ");

Когда вам нужно что-то более сложное, перейдите к регулярным выражениям (регулярным выражениям)
Это регулярное выражение отбросит последнюю часть строки "^(.+)\s-\s[^-]+$"

Всего несколько интересных ссылок, которые помогут построить и отладить регулярное выражение.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
Это показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]

Нота: я не программист на Java, я просто программист.


Member 13265840

Спасибо, я использовал hashmap, чтобы получить ответ