2016-07-12 34 views
0

Es ist ein bisschen schwierig zu erklären. In diesem Beispielcode:Wie kann ich die Liste aller Elemente (Hierarchie) innerhalb des Elements basierend auf Eltern-Kind-Beziehung erhalten?

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")); 

Ich möchte eine Funktion erstellen, die alle Objekte holen, die ein Objekt wird, das in es mit dem „Eltern“ Feld-Hierarchie ist. Wenn ich zum Beispiel nach "Test1Mem1Obj1" suche, sollte es mir die Werte von "{Test1Mem1, Test1}" geben und wenn ich nach "Test2Mem1" suche, sollte es mir die Werte von "{Test2}" geben. Ruft im Prinzip das Elternelement des Elternelements ab und so weiter. Es tut mir leid für diese Erklärung wegen der Sprachbarriere. Ich hoffe, dass mir jemand hier helfen kann. Vielen Dank!

Ich habe eine temporäre schmutzige Lösung und Sie können sehen, warum das nicht gut ist.

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

Ist es eine Voraussetzung, dass eine Liste verwendet wird? Ich denke eine Baumstruktur könnte hier besser dienen. –

+0

Auch ich sollte erwähnen, dass ich die Liste aus der MySQL-Datenbank lade. Es hat also keine Reihenfolge, und mit der Einschränkung der Implementierung kann ich die Baumstruktur nicht verwenden. – TheAwesomeGem

+0

Sind die IDs eindeutig? Können Sie stattdessen eine Karte verwenden? – Crummy

Antwort

1

Wenn Sie getParent() zurückgeben SomeClass anstelle eines String, ist es ziemlich einfach haben: obwohl

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 
} 

Vielleicht, das ist nicht möglich. Wenn Sie die Dinge in einer Karte stattdessen setzen können, etwa so:

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")); 

Dann könnten Sie Schleife über es so, mit Rekursion:

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); 
    } 
} 

Wenn Sie eine Liste aller Eltern ausfüllen möchten Rufen Sie für ein bestimmtes Element eine Funktion wie diese auf:

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

Danke für Ihre Antwort. Ich habe eine Lösung gefunden, sobald du deine veröffentlicht hast. Nun, wenn ich fragen darf, ob ich das hier effizient mache: http: //hastebin.com/faqazagoze.avrasm – TheAwesomeGem

+0

Versuchen Sie, alle Eltern, Großeltern usw. eines SomeTests auszudrucken? – Crummy

+0

Ja. Denkst du, ich könnte Stackoverflow bekommen? – TheAwesomeGem