Поиск JTree - PullRequest
       19

Поиск JTree

1 голос
/ 12 августа 2010

У меня есть JTree, который я пытаюсь найти.Я написал функцию быстрого рекурсивного поиска.Функция принимает в качестве строки пару имен родительского / дочернего узла.

private void RecursiveSearch(javax.swing.tree.DefaultMutableTreeNode node, java.util.ArrayList<TreeNode> nodelist, java.lang.String destination, java.lang.String origin) {
     nodelist.add(node);
     Controller.TreeData parentdata = (Controller.TreeData)node.getUserObject();
     for(int i = 0; i < node.getChildCount(); i++) {
        javax.swing.tree.DefaultMutableTreeNode childnode = (javax.swing.tree.DefaultMutableTreeNode)node.getChildAt(i);
        Controller.TreeData childdata = (Controller.TreeData)childnode.getUserObject();
        if (parentdata.GetName().trim().toUpperCase().equals(origin) && childdata.GetName().trim().toUpperCase().equals(destination)) {
            nodelist.add(childnode);
            return;
        }
    }
    // We didn't find it. Recurse.
    for(int i = 0; i < node.getChildCount(); i++) {
        RecursiveSearch((javax.swing.tree.DefaultMutableTreeNode)node.getChildAt(i), nodelist, destination, origin);
    }
    nodelist.remove(node);
}

Однако она не возвращает значения, когда это должно быть.Я получил корневой узел от TreeModel, и массив начинается пустым.Я проверил JTree и TreeModel, и ни один из них, кажется, не предлагает какой-либо функциональности поиска.Любые предложения?

Редактировать: я не собираюсь пытаться объяснить мою первоначальную функцию (она была первоначально написана на другом языке).Но я заменил его следующим:

javax.swing.tree.DefaultMutableTreeNode rootnode = (javax.swing.tree.DefaultMutableTreeNode)datatree.getModel().getRoot();
java.util.Enumeration nodeenum = rootnode.breadthFirstEnumeration();
while(nodeenum.hasMoreElements()) {
    javax.swing.tree.DefaultMutableTreeNode nextnode = (javax.swing.tree.DefaultMutableTreeNode)nodeenum.nextElement();
    Controller.TreeData data = (Controller.TreeData)nextnode.getUserObject();
    javax.swing.tree.DefaultMutableTreeNode parentnode = (javax.swing.tree.DefaultMutableTreeNode)nextnode.getParent();
    Controller.TreeData parentdata = (Controller.TreeData)(parentnode.getUserObject());
    if (parentdata.GetName().trim().toUpperCase().equals(origin) && data.GetName().trim().toUpperCase().equals(destination)) {
        datatree.setSelectionPath(new javax.swing.tree.TreePath(treemodel.getPathToRoot(nextnode)));
        return;
    }
}
javax.swing.JOptionPane.showMessageDialog(primaryframe, "Could not find the requested depots");

Однако, похоже, он ничего не находит.Я начал с корневого узла, поэтому он должен перечислять все дерево.Исправлена ​​ошибка исключения нулевого указателя в этой версии.

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

Если вы используете DefaultMutableTreeNode s с вашим TreeModel, вы можете просто использовать breadthFirstEnumeration() или depthFirstEnumeration()искать дерево.

2 голосов
/ 12 августа 2010

У меня есть несколько предложений

  • этот код не будет работать, если родительский элемент, дочерняя пара происхождения, пункт назначения встречаются в дереве более одного раза.Вы можете найти только первую пару и пропустить ее поддерево, которое может содержать больше вхождений
  • Я не знаю, почему вы добавляете узел в начале и удаляете его в конце.Гораздо проще было бы добавить оба узла (родительский, дочерний), когда вы его найдете.
  • вы можете оптимизировать свой код, поэтому, если parentnode! = Origin, вы не тестируете все родительские, дочерние пары.Если этот тест parentdata.GetName().trim().toUpperCase().equals(origin) не пройден, пропустите первый цикл

Можете ли вы привести пример ввода / вывода, чтобы я был уверен, какой у вас желаемый результат.

Имена origin иdestination звучит так, будто ты не ищешь ближайшего ребенка.Может ли путь между origin и destination быть длиннее 1?

...