2017-12-09 4 views
1

Also ich habe dieses Person-Objekt. Jede Person haben Liste der Personen-Objekt und so weiter ..Holen Sie das ausgewählte Objekt aus dem Baum basierend auf Übergabe Argument

public class Person { 
    .... 
    private List<Person> people = new ArrayList<>(); 

    .... 

    public List<Person> getPeople() { 
     return people; 
    } 

    public void setPeople(List<Person> people) { 
     this.people = people; 
    } 

enter image description here

ich bereits die maximale dept Antwort mit dem folgenden Code, Antwort, was int ich minus 1

public static int maxDepth(Person p) { 
     int maxChildrenDepth = 0; 
     for (Person c: p.getPeople()) { 
      maxChildrenDepth = Math.max(maxChildrenDepth, maxDepth(c)); 
     } 
     return 1 + maxChildrenDepth; 
    } 

Also, wenn ich Person Objekt & Int in Methode, lassen Sie sagen, getPersonLevel (List allPerson, 1), sollte ich alle Person Objekt in der Liste, die blaue Box sind, wenn ich 2 eingeben, ich sollte alle Objekte in der Liste erhalten von der roten Farbe bo x und so weiter, abhängig vom Argument int. Wie komme ich dazu? Jede Hilfe zu schätzen.

Antwort

0

Dieser funktioniert!

public Set<Person> getPersonLevel(Person person, int depth) { 
     Set<Person> aList = new HashSet<>(); 

     if (depth == 1) 
      aList.addAll(person.getPeople()); 

     if (depth > 1){ 
      for (Person pp : person.getPeople()) { 
        aList.addAll(getPersonLevel(pp, depth -1)); 
      } 
     } 
     return aList; 
    } 
1

Statt die Person als Parameter der Methode übergeben, warum nicht maxDepth und Methoden der Klasse Person machen?

Als Ergebnis würden Sie haben:

public class Person { 

    private Set<Person> people = new HashSet<>(); 

    public Set<Person> getPeople() { 
     return people; 
    } 

    public void setPeople(Set<Person> people) { 
     this.people = people; 
    } 

    public int maxDepth() { 
     int maxChildrenDepth = 0; 
     for (Person prs : people) { 
      maxChildrenDepth = Math.max(maxChildrenDepth, prs.maxDepth()); 
     } 
     return 1 + maxChildrenDepth; 
    } 

    public Set<Person> getPersonLevel(int depth) { 
     Set<Person> ppl = new HashSet<>(); 
     ppl.addAll(gatherEmployees(ppl, depth)); 
     return ppl; 
    } 

    private Set<Person> gatherEmployees(Set<Person> ppl, int depth) { 
     if (depth - 1 > 0 && people != null) { 
      people.forEach(prs -> ppl.addAll(prs.gatherEmployees(ppl, depth - 1))); 
     } 
     return people; 
    } 
} 
+0

es funktioniert nicht -> \t getPersonLevel nicht funktioniert, da es leer zurück – jimagic

+0

Sorry, ich schrieb, dass im Fluge, ich habe nicht die Zeit nehmen, um den Code zu testen. Ich habe meine Antwort bearbeitet, diese Version wurde getestet und ich kann Ihnen versichern, dass es funktioniert! –

Verwandte Themen