2016-09-29 1 views
3

Ich bin neu mit Sammlungen. Ich habe folgende Klasseretrive alle Kinder von N Anzahl der Ebenen Von Sammlung

class ParantCategory { 
    int id; 
    String name; 
    int pid; 
    public ParantCategory(int id, String name, int pid) { 
     this.id = id; 
     this.name = name; 
     this.pid = pid; 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getPid() { 
     return pid; 
    } 
    public void setPid(int pid) { 
     this.pid = pid; 
    } 
} 

und meine Hauptmethode Klasse ist als

public class HierachiDemo { 
    static ArrayList<ParantCategory> al = new ArrayList<>(); 
    public static void main(String[] args) { 
     al.add(new ParantCategory(1, "000", 0)); 
     al.add(new ParantCategory(2, "A1", 1)); 
     al.add(new ParantCategory(3, "B1", 1)); 
     al.add(new ParantCategory(4, "A11", 2)); 
     al.add(new ParantCategory(5, "A12", 2)); 
     al.add(new ParantCategory(6, "A13", 2)); 
     al.add(new ParantCategory(7, "B11", 3)); 
     al.add(new ParantCategory(8, "B12", 3)); 
     al.add(new ParantCategory(9, "B13", 3)); 
     al.add(new ParantCategory(10, "A111", 4)); 
     al.add(new ParantCategory(11, "A112", 4)); 
     al.add(new ParantCategory(12, "A113", 4)); 
     HierachiDemo h = new HierachiDemo(); 
     //function call here 
    } 
} 

ich Elemente in Arraylist gespeichert haben. Nun ist meine Frage, ich brauche Rekursionsfunktion in dem ich Name übergeben werde und es mir alle Kinder aus n Anzahl von Ebenen geben wird. zum Beispiel: Wenn ich A1 als Name gebe, dann sollte es mir alle Kinder wie A11, A12, A13 zurückgeben, und auch wenn Subkind von A11, A12, A13, die auch angezeigt werden sollte. Ich brauche das Endergebnis als A11, A12, A13, A111, A112, A113.

+0

Sind Eltern und Kind durch ID und PID verwandt? – matt

+0

Warum versuchen Sie, eine hierarchische Struktur in einer Liste (flach) darzustellen? – Spotted

Antwort

3

Eine einfache "Brute-Force" Lösung wäre:

List<ParantCategory> matches = new ArrayList<>(); 
for (ParantCatagory parant : al) { 
    if (parant.getName().startsWith("A1")) { 
    matches.add(al); 
    } 
} 

können Sie auch Java8 stattdessen mit einer einfachen Filterströme verwenden.

Natürlich funktioniert das für diesen einfachen String-Vergleich. Die Schlüssel Sache, die Sie müssen klären, ist was solche "Kind" Beziehungen tatsächlich bedeuten zu Ihnen. In Ihrem Beispiel haben Sie einfach gesagt uns, dass Sie "A112" als Kind von "A1" betrachten.

Also, um Ihren Kommentar zu adressieren: Wenn Sie echte hierarchische Ordnung implementieren möchten, dann müssen Sie auszudrücken dass im Code. Bedeutung: als Sie müssen möglicherweise Ihre eigene Baum Implementierung erstellen; wo Sie Ihre Objekte hinzufügen, und basierte Code, die Sie schreiben, bestellt Ihr Baum Elemente in solchen "Unterklasse" -Kategorien.

Mit anderen Worten: Ihr aktueller Code macht einfache Annahmen über Zeichenketten. Wenn Sie etwas anspruchsvolleres brauchen; Nun, dann Sie müssen das implementieren. Und der erste Schritt, den Sie machen müssen: Machen Sie sich klar, wie eine solche Beziehung definiert werden muss. Das ist nichts, womit wir helfen können!

Mit anderen Worten: Im Moment haben Sie nur Objekte dieser Parant-Klasse. Und diese Objekte haben absolut keine Beziehung zueinander. Wenn Sie solche Beziehungen wollen, müssen Sie Ihrer Klasse Mittel hinzufügen, um sie auszudrücken! Zum Beispiel, indem Sie Ihre Klasse in eine Klasse "Node" ändern; und ein Knoten ... verfügt über Methoden zum Hinzufügen/Abfragen Kind Knoten!

+0

Danke für Ihre Antwort. Angenommen, Kinder von A1 starten nicht mit "A1", was soll ich tun? –

+0

Ich habe meine Antwort aktualisiert; aber bitte verstehen Sie, dass es nicht zu viel gibt, mit dem wir wirklich helfen können. – GhostCat

+2

Ich denke, Sie haben den Namen verwendet, um eine Eltern-Kind-Beziehung zu erstellen, aber OP verwendet die ID/PID. Die ID/PID entspricht zufällig den Namen in diesem Beispiel. – matt

1

Wenn Sie mit der aktuellen Struktur bleiben wollen. Sie könnten eine Methode erstellen, die das macht, was Sie wollen. Es gibt zwei Dinge,

List<ParantCategory> getChildNodes(String name, int levels){ 
    List<ParantCategory> results = new ArrayList<>(); 
    ParantCategory head = null; 

    //assuming there is only one ParantCategory with the supplied name. 
    for(ParantCategory p: al){ 
     if(name.equals(al.getName())){ 
      head = al; 
      break; 
     } 
    } 

    //if we cannot find the name just use an empty list. 
    if(head==null) return results; 
    results.add(head); 
    results.addAll(getChildren(head.getPid(), levels)); 
    return results; 

}

Wir haben eine rekursive Methode für das Erhalten der Kinder machen.

void getChildren(int pid, levels){ 

    if(levels==0) return Collection.emptyList(); 

    List<ParantCategory> results = al.stream().filter(
      p->p.getPid()==pid 
     ).collect(Collectors.toList()); 
    for(ParantCategory p: results){ 
     results.addAll(getChildren(p.getPid(), levels-1)); 
    } 
    return results; 
} 
Verwandte Themen