2016-07-12 7 views
0

説明するのは少し難しいです。このサンプルコードでは:親子関係に基づいてアイテム内のすべてのアイテム(階層)のリストを取得するにはどうすればよいですか?

public class SomeClass 
{ 
    private String id; 
    private String parent; 

    public SomeClass(String id, String parent) 
    { 
     this.id = id; 
     this.parent = parent; 
    } 

    public String getParent() 
    { 
     return parent; 
    } 
} 

List<SomeClass> someList = new ArrayList(); 
someList.add(new SomeClass("Test1", "none")); 
someList.add(new SomeClass("Test2", "none")); 
someList.add(new SomeClass("Test1Mem1", "Test1")); 
someList.add(new SomeClass("Test2Mem1", "Test2")); 
someList.add(new SomeClass("Test1Mem1Obj1", "Test1Mem1")); 

私はそれが「親」フィールドと階層だ内のオブジェクトを含むされるすべてのオブジェクトを取得する関数を作成したいです。たとえば、 "Test1Mem1Obj1"を検索すると、 "{Test1Mem1、Test1}"の値が表示され、 "Test2Mem1"を検索すると "{Test2}"の値が表示されます。基本的に親の親の親をフェッチします。言語の壁のため、この説明には申し訳なく思っています。誰かが私をここで助けてくれることを願っていますありがとうございました!

私は一時的な汚れた解決策があり、なぜこれがうまくいかないのか分かります。

if(someObj.getParent() != null) 
{ 
    result.add(someObj.getParent()); 

    if(someObj.getParent().getParent() != null) 
    { 
     result.add(someObj.getParent().getParent()); 

     if(someObj.getParent().getParent().getParent() != null) 
     { 
      result.add(someObj.getParent().getParent().getParent()); 
     } 
    } 
} 
+0

Listを使用する必要がありますか?私はツリー構造がここでより良く役立つかもしれないと思っています。 –

+0

また、私はMySQLデータベースからリストを読み込むことに言及する必要があります。だから、順序と実装の制限を持っていない、私はツリー構造を使用することはできません。 – TheAwesomeGem

+0

idsは一意ですか?代わりに地図を使用できますか? – Crummy

答えて

1

あなたの代わりにStringSomeClassを返すgetParent()持つことができるならば、それは非常に簡単です:

public boolean isDescendantOf(String parentName) { // part of SomeClass 
    SomeClass parent = this.parent; 
    while (!parent.id.equals("none")) { // or null check 
     if (parent.id.equals(parentName)) { 
      return true; // found a parent named parentName 
     } 
    } 
    return false; // eventually reached a parentless parent and never found one matching parentName 
} 

たぶんそれはしかし、ことはできません。あなたはすべての親のリストを移入する場合

public boolean isDescendentOf(SomeClass child, String parentName) { 
    SomeClass parent = map.get(child.parent); 
    if (parent == null) { 
     throw new RuntimeException("Warning: parent doesn't exist!"); 
    } 
    if (parent.id.equals(parentName)) { 
     return true; 
    } else { 
     return isDescendentOf(parent, parentName); 
    } 
} 

:このようなそれ以上の

Map<String, SomeClass> map = new HashMap<>(); // map from parent name to SomeClass 
map.put("Test1", new SomeClass("Test1", "none")); 
map.put("Test2", new SomeClass("Test2", "none")); 
map.put("Test1Mem1", new SomeClass("Test1Mem1", "Test1")); 
map.put("Test2Mem1", new SomeClass("Test2Mem1", "Test2")); 
map.put("Test1Mem1Obj1", new SomeClass("Test1Mem1Obj1", "Test1Mem1")); 

次に、あなたはできるループ、再帰を使用して:あなたはそうのように、代わりにマップで物事を置くことができる場合ある要素に対して、次のような関数を呼び出します。

public static void PopulateParents(List<String> parents, Map<String, ClassTest> nodes, ClassTest child) { 
    if (child.parent.equals("none")) { 
     return; 
    } 
    ClassTest parent = nodes.get(child.parent); 
    if (parent == null) { 
     throw new RuntimeException("No parent exists called " + child.parent); 
    } 
    parents.add(parent.id); 
    PopulateParents(parents, nodes, parent); 
} 
+0

ご返信ありがとうございます。あなたがあなたの投稿したときにすぐに解決策を見つけました。今私が尋ねることができる場合私はここでこれを効率的にやっているかどうか:http://hastebin.com/faqazagoze.avrasm – TheAwesomeGem

+0

SomeTestの両親、祖父母などを印刷しようとしていますか? – Crummy

+0

はい。私はスタックオーバーフローを起こすかもしれないと思いますか? – TheAwesomeGem

関連する問題