代码之家  ›  专栏  ›  技术社区  ›  Puppy

搜索JTree

  •  1
  • Puppy  · 技术社区  · 15 年前

    我有一棵树,我正在找。我已经编写了一个快速递归搜索函数。该函数将父/子节点名称对作为字符串。

    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 回复  |  直到 13 年前
        1
  •  2
  •   jethro    15 年前

    我没有什么建议

    • 如果父、子源、目标对在树中出现一次以上,则此代码将不起作用。您只能找到第一对,并跳过它的子树,它可以包含更多的出现
    • 我不知道你为什么要在开头添加节点,然后在结尾删除它。更简单的方法是在找到节点时添加两个节点(父节点、子节点)。
    • 您可以优化您的代码,以便如果parentnode!=你不能测试所有的父,子对。如果这个测试 parentdata.GetName().trim().toUpperCase().equals(origin)

    你能提供一些I/O的例子,这样我就可以确定你想要的结果是什么了。

    名字 origin destination 听起来你不想找直接的孩子。Can路径介于 起源 目的地 比1长?

        2
  •  3
  •   Adamski    15 年前
    推荐文章