1

検索しようとしている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");

しかし、実際には何も見つからないようです。ルートノードから始めたので、ツリー全体を列挙する必要があります。このバージョンのnullポインタ例外のバグを修正しました。

4

2 に答える 2

3

DefaultMutableTreeNodes wihtinを使用する場合は、またはをTreeModel使用してツリーを検索できます。breadthFirstEnumeration()depthFirstEnumeration()

于 2010-08-12T16:55:15.073 に答える
2

提案はほとんどありません

  • このコードは、親、子の起点、終点のペアがツリー内で複数回発生する場合は機能しません。最初のペアのみを検索し、より多くのオカレンスを含む可能性のあるサブツリーをスキップできます
  • 最初にノードを追加し、最後にノードを削除する理由がわかりません。見つけたときに両方のノード(親、子)を追加する方がはるかに簡単です。
  • コードを最適化できるため、parentnode!= originの場合、すべての親子ペアをテストするわけではありません。このテストparentdata.GetName().trim().toUpperCase().equals(origin)が失敗した場合は、最初のループをスキップしてください

I / Oの例をいくつか挙げていただければ、希望する結果が得られるかどうかを確認できます。

名前origindestinationあなたが直接の子供を探していないように聞こえます。originとの間のパスdestinationは1より長くできますか?

于 2010-08-12T16:51:08.057 に答える