Großeltern herausfinden Java - Map?

mr.kottig

Neues Mitglied
Hallöchen. ich habe die Aufgabe bekommen in Java die Großeltern einer bestimmten Person (z.B. Kevin) herauszufinden.

Ausgangslage:
  • Claudia ist die Tochter von Paul und Maria
  • Peter ist der Sohn von John und Anne
  • Kevin ist der Sohn von Claudia und Peter
  • Jane ist die Tochter von Claudia und Peter
Nun bin ich schon mehrfach über die DS Map gestolpert, aber ich weiß nicht wie/ in welcher Form ich das konkret auf die Aufgabe anwenden soll. Irgendwelche Ratschläge?
 
versuch mal eine baumstruktur mit hilfe deiner personen zu erzeugen

class person
String name
String gender
List<Person> kinder
getChildren -> liefert die Liste

dann probierst du für jede Person diese Reihe aus:
1. person getChildren -> dann for each element nochmal getchildren -> falls es alles leer ist abbruch
2. in der for each nochmal getChildren -> falls für jedes getChildren leer ist -> abbruch
3. falls irgend eine Person beim zweiten Durchlauf ein Kind hat -> es muss ein Großeltern Teil sein
 
versuch mal eine baumstruktur mit hilfe deiner personen zu erzeugen
Nur um kurz klugzuscheiszern: Familienbaeume sind schlecht als Trees darstellbar, es sind mehr ungerichtete Graphen.

class person
String name
String gender
List<Person> kinder
getChildren -> liefert die Liste
Gefaellt mir. Man koennte noch die Verweise auf die Eltern mit hinein nehmen beim aufbauen, dann kann man das an irgendeiner Stelle betreten, zwei Elteren hoeher gehen und hat die Groszeltern.
 
Vielen Dank für die Rückmeldung ihr Beiden!
Ich muss glaube ich muss nicht dazu sagen, dass ich noch absolut auf dem Schlauch stehe, wenn ich euch meinen bisherigen Code präsentiere..

Java:
public class Person {

    String name;
    String gender;
    List<Person> kinder;

  public Person(String name, String gender) {
        this.name = name;
        this.gender = gender;

    }
   
    public List<Person> getKinder() {
        return kinder;
    }
}

##############################

Java:
public class MainGroßeltern {

    public static void main(String[] args) {
      
        Person claudiaPerson = new Person("Claudia","female");
        Person peterPerson = new Person("Peter","male");
        Person johnPerson = new Person("John","male");
        Person annePerson = new Person("Anne","female");
        Person kevinPerson = new Person("Kevin","male");
        Person janePerson = new Person("Jane","female");

        List<Person> kinder = new ArrayList<>();
        kinder.add(claudiaPerson);
        kinder.add(peterPerson);
        kinder.add(johnPerson);
        kinder.add(annePerson);
        kinder.add(kevinPerson);
        kinder.add(janePerson);

       
        for (Person person : kinder) {
            System.out.println(person.getKinder());
        }      
    }
}
 
Zuletzt bearbeitet von einem Moderator:
1. Code bitte immer mit dem Code-Tag posten
2. Schaut doch schon mal grundsätzlich nicht schlecht aus. Alerrdings wirst du nicht glücklich werden, wenn du die Beschreibung des Listenobjekts ausgeben lässt anstatt die darin enthaltenen Elemente. Person.getKinder() ist nämlich kein Text, sondern eine Liste von Person-Objekten.

Deiner Klasse "Person" fehlt noch die Information, wer die Eltern sind. D.h. so wie eine Liste der Kinder gibt es auch eine Liste der Eltern (besser noch wäre ein Set, damit du ein Kind oder ein Elternteil nicht zweimal hinzufügen kannst).

Wie wäre es, wenn du den direkten Zugriff auf die Liste durch eine Methode namens addChild(Person p) ersetzt?
Die macht dann folgendes:
Java:
void addChild(Person p) {
   this.kinder.add(p);
   p.addParent(this);
}

Edit: Huch, das hab ich ja ganz übersehen ... Du erstellst in deinem Mainprogramm ein Liste Kinder .... wozu?
(Anm: Ich geh im Folgenden davon aus, dass du den Zugriff auf die Klassenvariable Kinder durch Methoden regelst)

Du willst das Kind doch einer bestimmten Person zuweisen und keine generelle Liste von Kindern haben.
Richtig wäre

Java:
claudiaPerson.addChild(kevinPerson).
Damit wird der Kinder-Liste im claudiaPerson-Objekt das Elekent kevinPerson hinzugefügt. Und falls du meinen vorigen Vorschlag umgesetzt hast, ist dann auch Claudia ein Element von kevinPerson.getParents()

ps: Du lässt hier grundsätzlich Schreibzugriff auf die Liste von außen zu.
Java:
claudiaPerson.getChildren().add(kevinPerson);
kevinPerson.getParents().add(claudiaPerson;

würde auch funktionieren (anstatt addChild und addParent), damit hast du aber eine neue mögliche Fehlerquelle.
 
Zuletzt bearbeitet:
In Prolog wäre das irgendwie so bin mir aber nicht mehr sicher:
Code:
mutter(maria, claudia).
vater(paul, claudia).
mutter(anne, peter).
vater(john, peter).
mutter(claudia, kevin).
vater(peter, kevin).
mutter(claudia, jane).
vater(peter, jane).

eltern(X,Y,Z) :- mutter(X,Z), vater(Y,Z).
grosseltern(A,B,C,D,X) :- eltern(A,B,Y), eltern(C,D,Z), eltern(X,Y,Z).

/** <examples>

?- grosseltern(a,b,c,d,kevin).

*/
 
In Prolog wäre das irgendwie so bin mir aber nicht mehr sicher:
Code:
mutter(maria, claudia).
vater(paul, claudia).
mutter(anne, peter).
vater(john, peter).
mutter(claudia, kevin).
vater(peter, kevin).
mutter(claudia, jane).
vater(peter, jane).

eltern(X,Y,Z) :- mutter(X,Z), vater(Y,Z).
grosseltern(A,B,C,D,X) :- eltern(A,B,Y), eltern(C,D,Z), eltern(X,Y,Z).

/** <examples>

?- grosseltern(a,b,c,d,kevin).

*/
prolog ist nicht java.. prolog ist dafür da "alles auszuprobieren"
 
Was sinnvoll wäre ist bei add Children eine überprüfugn rein zu tun

wenn man eins hinzufügt -> isParent auf true setzen
wenn man ein kind weg nimmt -> schauen ob man noch eins hat wenn nein auf false

dann bei der überprüfugn nur noch das isParent durchgehen
das "getChildren" war so gedacht:

du bekommst eine liste von personen und bei allen ürofst du durch ob die auch kinder haben wenn eins davon auch ein kind hat dann kann man sagen dass es ein großeltern teil ist
 
Nur um kurz klugzuscheiszern: Familienbaeume sind schlecht als Trees darstellbar, es sind mehr ungerichtete Graphen.


Gefaellt mir. Man koennte noch die Verweise auf die Eltern mit hinein nehmen beim aufbauen, dann kann man das an irgendeiner Stelle betreten, zwei Elteren hoeher gehen und hat die Groszeltern.
ich wollte das "has Parent" nicht einbauen also dass man immer nur tiefer gehen kann aber niemand weis wer seine eltern sind oder ob man welche hat deswegen baum und nicht ungerichtet 😀
 
prolog ist dafür da "alles auszuprobieren"
Man nennt es auch Resolution.

Hier nochmal richtig...

Code:
male(paul).
male(john).
male(peter).
male(kevin).
female(claudia).
female(anne).
female(maria).
female(jane).

parent(maria, claudia).
parent(paul, claudia).
parent(anne, peter).
parent(john, peter).
parent(claudia, kevin).
parent(peter, kevin).
parent(claudia, jane).
parent(peter, jane).

grand_parent(X, Y) :- parent(Z, X), parent(Y, Z).
omas(X, Y) :- female(Y), parent(Z, X), parent(Y, Z).
opas(X, Y) :- male(Y), parent(Z, X), parent(Y, Z).

/** <examples>
?- grand_parent(kevin, A).
?- omas(kevin, B).
?- opas(kevin, C).
*/

ausprobieren könnt ihr ihn hier: https://swish.swi-prolog.org/
 
Zuletzt bearbeitet:
Roflcopter.gif
 

Neue Themen


Zurück
Oben