2012-02-27 18 views
4

私はオブジェクトTのリストを持っています。これは、トップオブジェクトの親プロパティがnullのparentというプロパティを持っています。私はすべてのオブジェクトをTreeSet(またはTreeMap)に入れたいと思います。最上位レベルのオブジェクトは、親を持たない(親がnull)すべてのルートオブジェクトであり、その下位に子を持ちます。フラットリストからJava階層ツリーセットを作成する

この

   o 
     /| \ 
      Ra Rb Rc   -- Level Root Objects 
     /| \ | \ 
     Ca1 Ca2 Cb1 Cc1 Cc2 -- Level of First Children 
    / \ 
    Ca11 Ca12.............. -- Level of Second Children 

のようなものだから私は(... Ca1と、CA2、CA11、CA12)のRaを取得し、その子を見つけることができます

更新: 申し訳ありませんが、それはなかったかもしれノードが親を指し、親がnullの場合はルートノードです。問題は両親が子供を知る必要があることです。しかし、その関係は逆の方向にある。

class Node 
{ 
    private Node parent; 
    private String name; 
} 
+0

Yustを思い付くソリューションです...(何の質問は「質問は」あなたではありません) –

+0

:ような何か構造はどのように見える? – Adrian

答えて

1

ここで私はそれを行うか、質問して

SortedSet<Node> nodeSet = new TreeSet<Node>(new Comparator<Node>() { 
    public int compare(Node node1, Node node2) { 

     if (node1.getParent() == null) { 
      if (node2.getParent() == null) { 
       return node1.getId().compareTo(node2.getId()); 
      } 
      return -1; 
     } 

     if (node2.getParent() == null) return 1; 

     int parentCompare = node1.getParent().getId() 
       .compareTo(node2.getParent().getId()); 

     if (parentCompare == 0) 
      return node1.getId().compareTo(node2.getId()); 

     return parentCompare; 
    } 
}); 

nodeSet.addAll(allData); // allData is the Node list 


Map<Node, List<Node>> map = new HashMap<Node, List<Node>>(); 

for(Node node : nodeSet) 
{ 
    if(map.get(node)==null) 
    { 
     map.put(node, new ArrayList<Node>()); 
    } 
    map.get(node).add(node); 
    Node parentNode = node.getParent(); 
    while(parentNode!=null) 
    { 
     map.get(parentNode).add(node); 
     parentNode = parentNode.getParent(); 
    } 
} 

// At this point I can get an element from map and see all children in values. 
+0

ノードの子ノードを表示するだけであれば、ノードを追加する前にノードをソートセットに追加する必要はありません。ノードをソートする目的は何ですか? –

+0

真であるが、そのセットは順序を保つのに役立つ – aug70co

+0

子ノードの順序を保持したいならば、 'Map'を' Map > '型にすることができます。 nodeList –

10

TreeSetがJavaで何をしているのかはっきりしないと思います。 TreeSetは、単に内部的にツリーを使用するSetインターフェイスの実装です。同様にTreeMapの場合。それは、あなたが両親から子どもまでトラバースできる一般的なツリー構造ではありません。ツリーを使用するという事実は厳密に内部実装の詳細です。

複数のオブジェクトがあり、それぞれに「親」オブジェクトへの参照が含まれていることを理解します。これらの "親"リンクはツリーを形成しますが、反対方向ではなく、親から子へと移動したいと考えています(これは簡単でしょう)。

この場合、おそらくオブジェクトのリストを参照し、親オブジェクトからListの子オブジェクトにMapを作成します。あなたのデータを何

Map<Node,List<Node>> tree = new HashMap<Node,ArrayList<Node>>(); 
List<Node>   roots = new ArrayList<Node>(); 
for(Node n : nodes) { 
    if(n.parent == null) 
    roots.add(n); 
    else { 
    if(!tree.containsKey(n.parent)) 
     tree.put(n.parent, new ArrayList<Node>()); 
    tree.get(n.parent).add(n); 
    } 
} 
+0

あなたはツリーにルーツを関連付けるのを忘れましたか? – aug70co

+0

いいえ。各ルートはそれぞれ独自のツリーです。 'roots'のものから始まるすべてのノードをトラバースすることができます。 –

関連する問題