1

ツリーデータ構造の使用を必要とするプロジェクトに取り組んでいます。いくつかの調査を行った結果、Java JTreeが私のプロジェクトに非常に役立つことがわかりましたが、1週間かけて修正したが、役に立たなかったという問題に遭遇しました。

ここに問題があります。新しいノードを作成するには、DefaultMutableTreeNodeをインスタンス化する必要があり、それをループで実行する方法がわかりません。通常、JTreeに新しいノードを作成する場合は、最初に次の方法でノードを宣言します。

DefaultMutableTreeNode parent = new DefaultMutableTreeNode("This is parent node.");
DefaultMutableTreeNode child = new DefaultMutableTreeNode("This is child node.");

次に、子ノードを親ノードに追加/リンクするには、次のようにします。

parent.add(child);

親ノードと子ノードを含む2つのアレイリストがあります。これらは親子関係で相互に対応しています。つまり、arraylistParent.get(x)は常にarraylistChild.get(x)の親になります。

forループを使用することで、次のことができると考えていました。

for (int x = 0; x < arraylistParent.size(); x++){
    parent.add(new DefaultMutableTreeNode(arraylistChild.get(x)));
}

これはフラットな階層ツリーでのみ機能しますが、私には明らかに当てはまりません。arrayListParentには、子ノードを追加する前に確認する必要のある異なる親ノードがありますが、ここでも、すべての子ノードが同じ単一の親ノードを持っているわけではありません。私のアレイリストには、おそらく次のようなものが含まれています。

arraylistParent = [root, p1, p2, p2, p3, p1]
arraylistChild = [p1, p2, p5, p3, p4, p5]

そして私はこのようなツリー構造を生成したいと思います:

root
  ..p1
    ..p2
      ..p5          
      ..p3
        ..p4
    ..p5

明らかに、parent.getUserObject()がarraylistParent.get(x)と同じであるかどうかを確認するために、いくつかのifループを内部にスローできますが、文字列「Thisisparentnode」に一致するものだけがチェックされて追加されます。

ループ内に別の存在しない親が見つかった場合は、新しい親を作成する必要があります。これは、ループに新しい親を自動的に作成させる方法がわからないため、解決方法がわからないトリッキーな部分です。子ノードの親のインスタンス。

4

1 に答える 1

2

ノードデータが文字列であると仮定します(つまり、ArrayListsの内容は文字列です)。ただし、この説明は他のJavaオブジェクトでも機能します。これらのコンテンツを「ツリーノード」とは異なり、「ノード」と呼びます。

を作成してHashMap<String, DefautMutableTreeNode> mm.get(node)対応するを返すことができますTreeNode

ここで、親の配列リストを反復処理する必要があります。それぞれの位置に、親と子がいます。それらを地図で調べてください。親TreeNodeが存在しない場合は、最初にそれを作成する必要があります。子TreeNodeが存在しない場合、同じことが適用されます。TreeNodeを作成した後、マップが更新されていることを確認する必要があります。最後に、子を親の子としてマークします。

このアルゴリズムの最後に、子配列内のすべてのノードを調べる必要があります。親がいないものがルートです。これはあなたの木の根です。

于 2012-11-08T10:55:41.897 に答える