2016-03-18 41 views
0

フラットデータから階層を作成しようとしています。私は、次のNodeの定義があります。私は、次のことを試してみた再帰を使用して子ノードを作成する

Person 
    |--Manager 
     |--Hourly 
      |--New 

このデータを考慮
public class Node { 
     public String name; 
     public List<Node> children = new ArrayList<>(); 
    } 

[Person,Manager,Hourly,New]、ツリーはようにする必要があり

public void run() 
    { 
     List<List<String>> objects = new ArrayList<>(); 

     String[] str = {"Person","Manager","Hourly","New"}; 
     objects.add(Arrays.asList(str)) ; 

     String[] str2 = {"Person","Manager","Salary"}; 
     objects.add(Arrays.asList(str2)) ; 

     String[] str3 = {"Person","Manager","Salary", "New"}; 
     objects.add(Arrays.asList(str3)) ; 

     // Create a Node with the sequence 
     myNode = new Node(); 
     createNode(objects.get(0), 0, myNode, myNode); 
     LOG.debug(myNode.name); 
} 

そして、私のcreateNode方法は:

public Node createNode(List<String> seq, Integer start, Node parentNode, Node childNode) 
    { 
     // do something and return a Node? 
    } 

しかし、概念的には、Javaが戻り値である場合に構造を維持する方法を理解できません。私はあなたの方法にNode戻り値の型Node引数の両方を必要としないPerson

+0

Javaが価値によって返されているとはどういう意味ですか? –

答えて

0

の子としてマネージャ - > Hourly->新しい階層を追加できるように、私はcreateNodeに何を追加します。ここで

はそれを行うための一つの方法です:

//in run() 
myNode = new Node(); 
myNode.name = "Root"; 
createNode(objects.get(0), 0, myNode, myNode); 



public void createNode(List<String> seq, Integer start, Node parentNode) 
{ 
    Node childNode = new Node(); 
    childNode.name = seq[start]; 
    parentNode.children.Add(childNode); 
    createNode(seq, start+1, childNode); 
} 

あなたはcreateNode()から何かを返す必要はありません - あなたは変数としてparentNodeを持っているので、あなたはそのchildrenメンバーに物事を追加することができます。 createNode()の呼び出しは、子孫ノードを再帰的に追加します。子ノードは文字列配列の最後に追加されます。それを行うには

もう一つの方法は、このようなものです:この場合

public Node createNode(List<String> seq, Integer start) 
{ 
    if (start >= seq.Length) { 
     return null; 
    } 
    Node node = new Node(); 
    node.name = seq[start]; 
    node.children.Add(createNode(seq, start+1); 

    return node; 
} 

、あなたはすべてのnodeの参照を渡す必要はありません。 createNode()を呼び出すと、新しいノードオブジェクトが生成され、childrenツリーが再帰的に埋められ、新しく生成されたノード構造が返されます。

+0

ありがとう、これは完全に働いた。 – David

0

私が見ることができるように、ノードのdefinationはグラフのadjacency listと幾分似ています。 ターゲットノードで、ターゲットノードに関連付けられたリストに関連ノードを追加します。これは、すべてのノードに属する各ノードに当てはまります。

createNodeメソッドのオブジェクト配列(配列パラメーター)に属する各オブジェクトについて、Nodeオブジェクトを作成する必要があります。 は文字列配列とタイセットノードを渡すだけです。リストを反復してノードを作成します。リストにノードを追加します。

ノードの作成中に重複しないようにするには、それらをマップに追加します。マップのキーはStringで、値はNodeオブジェクトでなければなりません。ノードのオブジェクトを作成する前に、マップからオブジェクトを取得しようとします。オブジェクトがマップに見つからない場合(このような場合はマップを作成してマップに追加する場合のみ)、オブジェクトを作成してください。オブジェクトがマップから見つからない場合、私たちはそれを再作成しません。

関連する問題