# Wie beginne ich diese Aufgabe?



## kilopack15 (28. Okt 2016)

Hallo 
habe Schwierigkeiten eine Aufgabe zu beginnen. Es wäre schön wenn ihr mir die ersten Schritte aufzeigen könntet. Den Rest würde ich gerne selbst machen. Folgendes:  Eine Klasse Person habe ich vorgegeben. Ich soll eine Methode *erzeugeStammbaum() *in eine Klasse Standesamt implementieren. Dabei sollte die Methode eine Instanz für jede Person des unten dargestellten Stammbaumes anlegen und dabei die Attribute der Personen entsprechend der Beziehungen im Stammbaum setzen.

Die *vorgegebene Klasse Person* bietet *verschiedene Konstruktoren und Setter*, um die Attribute auch nach Erzeugen der Instanz zu verändern. Anschließend wird als Rückgabewert die Instanz der Person Magdalena (unten im Stammbaum) zurück gegeben.

Stammbaum:

*Zum Verständnis:* Martina und Achim haben das Kind Lena.

Klasse Person:


```
public class Person {

    private Person mutter;
    private Person vater;
    private Person kind;
    private String name;

    public Person(String name){
        this.name=name;
    }

    public Person(String name, Person mutter, Person vater){
        this(name);
        this.mutter = mutter;
        this.vater = vater;
    }

    public Person(String name, Person mutter, Person vater, Person kind){
        this(name, mutter, vater);
        this.kind = kind;
    }

    public Person getVater() {
        return vater;
    }

    public void setVater(Person vater) {
        this.vater = vater;
    }

    public Person getMutter() {
        return mutter;
    }

    public void setMutter(Person mutter) {
        this.mutter = mutter;
    }

    public Person getKind() {
        return kind;
    }

    public void setKind(Person kind) {
        this.kind = kind;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString(){
        return this.name;
    }
```


----------



## Xyz1 (28. Okt 2016)

Schöne Aufgabe, so funktioniert's:

```
/**
 * @author
 */
public class Person {

    private Person mutter;
    private Person vater;
    private Person kind;
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, Person mutter, Person vater) {
        this(name);
        this.mutter = mutter;
        this.vater = vater;
    }

    public Person(String name, Person mutter, Person vater, Person kind) {
        this(name, mutter, vater);
        this.kind = kind;
    }

    public Person getVater() {
        return vater;
    }

    public void setVater(Person vater) {
        this.vater = vater;
    }

    public Person getMutter() {
        return mutter;
    }

    public void setMutter(Person mutter) {
        this.mutter = mutter;
    }

    public Person getKind() {
        return kind;
    }

    public void setKind(Person kind) {
        this.kind = kind;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return this.name;
    }

    public static void main(String[] args) {
        Person[] p = {
            new Person("Martina"),
            new Person("Achim"),
            new Person("Paul"),
            new Person("Johanna"),
            new Person("Lena"),
            new Person("Bernd"),
            new Person("Magdalena")
        };
        p[0].setKind(p[4]);
        p[1].setKind(p[4]);
        p[2].setKind(p[5]);
        p[3].setKind(p[5]);
        p[4].setKind(p[6]);
        p[5].setKind(p[6]);
        p[4].setMutter(p[0]);
        p[5].setMutter(p[3]);
        p[6].setMutter(p[4]);
        p[4].setVater(p[1]);
        p[5].setVater(p[2]);
        p[6].setVater(p[5]);

        iterate(p[6]);
    }

    public static void iterate(Person p) {
        if (p.getMutter() != null) {
            if (!p.getMutter().getKind().getName().equals(p.getName())) {
                throw new IllegalArgumentException();
            }
        }
        if (p.getVater() != null) {
            if (!p.getVater().getKind().getName().equals(p.getName())) {
                throw new IllegalArgumentException();
            }
        }
        System.out.println("Ich bin " + p + ", Mutter: " + p.getMutter() + ", Vater: " + p.getVater() /*+ ", Kind: " + p.getKind()*/);
        if (p.getMutter() != null) {
            iterate(p.getMutter());
        }
        if (p.getVater() != null) {
            iterate(p.getVater());
        }
    }
}
```


```
Ich bin Magdalena, Mutter: Lena, Vater: Bernd
Ich bin Lena, Mutter: Martina, Vater: Achim
Ich bin Martina, Mutter: null, Vater: null
Ich bin Achim, Mutter: null, Vater: null
Ich bin Bernd, Mutter: Johanna, Vater: Paul
Ich bin Johanna, Mutter: null, Vater: null
Ich bin Paul, Mutter: null, Vater: null

Ich bin Magdalena, Mutter: Lena, Vater: Bernd, Kind: null
Ich bin Lena, Mutter: Martina, Vater: Achim, Kind: Magdalena
Ich bin Martina, Mutter: null, Vater: null, Kind: Lena
Ich bin Achim, Mutter: null, Vater: null, Kind: Lena
Ich bin Bernd, Mutter: Johanna, Vater: Paul, Kind: Magdalena
Ich bin Johanna, Mutter: null, Vater: null, Kind: Bernd
Ich bin Paul, Mutter: null, Vater: null, Kind: Bernd
```

In Datenbanken mussten wir das mal machen, da ist aber nicht so lustig.


----------



## kilopack15 (29. Okt 2016)

Hallo DerWissende und Danke für deine Lösung. Allerdings war nich danach gefragt, eine main-Methode zu erstellen, sondern in einer zweiten klasse eine Funktion erzeugeStammbaum zu erstellen, die die entsprechenden Instanzen setzt. Vielleicht kannst du mir da ja weiterhelfen?


----------



## Xyz1 (29. Okt 2016)

Ja,

```
public Person erzeugeStammbaum() { /* TODO: kopieren... */ }
```

void ginge auch

Bearbeitung: Also ihr sollt unterschiedliche Personenobjekte erstellen/instantiieren und ihr sollt sinnvoll die oben zu sehen Assoziationen setzen. Damit wird Stammbaum wie oben zu sehen "erzeugt".

Du müsstest Lesen: Konstruktor, (Objekt-)Methode, Variable, Rückgabe-Typ... Argumente


----------



## kilopack15 (29. Okt 2016)

OKay, aber so etwas wie "thrownewIllegalArgumentException();" oder "iterate" hatten wir noch nie und ich weiß auch nicht, was diese Ausdrücke machen..


----------



## mrBrown (29. Okt 2016)

Lass dich davon nicht verwirren 

Zerleg dir die Aufgabe einfach selber in kleine Einzelschritte.

Fang doch erstmal damit an, dass die Methode die Person mit dem passenden Namen zurückgibt. Das solltest du doch schaffen?


----------



## JStein52 (29. Okt 2016)

Am einfachsten wird es wenn du erst mal die ganzen Personen ohne Verknüpfung anlegst:


```
Person martina = new Person("Martina");
            Person achim    = new Person("Achim");
            Person paul       = new Person("Paul");
            Person johanna = new Person("Johanna");
            Person lena        = new Person("Lena");
            Person bernd     = new Person("Bernd");
            Person magdalena = new Person("Magdalena");
```

Und dann fängst du von unten an, die richtigen Beziehungen einzutragen:

```
magdalena.setMutter(lena);
magdalena.setVater(bernd);

usw.
```
und am Ende steht return magdalena;


----------



## Xyz1 (29. Okt 2016)

JStein52 hat gesagt.:


> Am einfachsten wird es wenn du erst mal die ganzen Personen ohne Verknüpfung anlegst:
> 
> Und dann fängst du von unten an, die richtigen Beziehungen einzutragen:
> 
> und am Ende steht return magdalena;



Sehr schön erklärt, das war auch mein Gedanke, wie es wohl am einfachsten ist...

`throw new Ex` ist nur eine KLEINE Validierung, ob der Stammbaum richtig "zusammengesetzt" wurde. Sollte nicht weiter stören und ist überflüssig.

Bearbeitung: Und "iterate" ist einfach ein Methodenname, keine besondere Bedeutung. "traverse" wäre vielleicht 'richtiger'. 

Und mit Argumente meinte ich formal and actual parameters.


----------



## kaporalix (29. Okt 2016)

ok so würde ich es Klasse Standesamt implementieren:


```
public class Standesamt {
   
    Person martina = new Person("Martina");
    Person achim = new Person("Achim");
    Person paul = new Person("Paul");
    Person johanna = new Person("Johanne");
    Person lena = new Person("Lena");
    Person bernd = new Person("Bernd");
    Person magdalena = new Person("Magdalena");
   
    public void erzeugeStammbaum()
    {
        magdalena.setVater(bernd);
        magdalena.setMutter(lena);
        lena.setVater(achim);
        lena.setMutter(martina);
        lena.setKind(magdalena);
        ....    
    }
}
```

alternative:



```
public class Standesamt {
   
    Person martina;
    Person achim;
    Person paul;
    Person johanna;
    Person lena;
    Person bernd;
    Person magdalena;
   
    public void erzeugeStammbaum()
    {
        bernd.setName("Bernd");
        bernd.setVater(paul);
        bernd.setMutter(johanna);
        ....
    }

}
```


----------



## Xyz1 (29. Okt 2016)

kaporalix hat gesagt.:


> alternative:


Du hast die Erzeugung der Objekte/Pers vergessen...


----------



## JStein52 (29. Okt 2016)

Die Alternative ist keine Alternative ! Da fehlt ja das erzeugen der ganzen Personen (die news).
Das erste kann man so machen aber in der Aufgabe stand doch dass du die Personen in erzeugeStammbaum() anlegen sollst ?! Also gehört dieser ganze Teil auch in die Methode rein.


----------



## JStein52 (29. Okt 2016)

kaporalix hat gesagt.:


> alternative


Du kannst deine Alternative ja einfach mal ausprobieren und gucken was passiert.
Oder seid ihr noch nicht beim praktischen Teil ?


----------



## kilopack15 (29. Okt 2016)

So! Ich hab es bis jetzt so gemacht. Allerdings sind ja noch eine Menge der Funktionen und Konstruktoren der Klasse Person ungenutzt und ich verstehe nicht, wie jetzt magdalena returned wird. Könnt ihr mir da helfen?  
Danke schonmal für die rege Beteiligung hier im Forum - Top!


```
public class Standesamt {
   
    Person martina = new Person("Martina");
    Person achim = new Person("Achim");
    Person paul = new Person("Paul");
    Person johanna = new Person("Johanna");
    Person lena = new Person("Lena");
    Person bernd = new Person("Bernd");
    Person magdalena = new Person("Magdalena");
   
   
    public void erzeugeStammbaum(){
        magdalena.setMutter(lena);
        magdalena.setVater(bernd);
        lena.setKind(magdalena);
        lena.setMutter(martina);
        lena.setVater(achim);
        bernd.setMutter(johanna);
        bernd.setVater(paul);
        bernd.setKind(magdalena);
        martina.setKind(lena);
        achim.setKind(lena);
        johanna.setKind(bernd);
        paul.setKind(bernd);
  
    }
    }
```


----------



## JStein52 (29. Okt 2016)

Ich hätte es so gemacht:


```
public Person erzeugeStammbaum(){

    Person martina = new Person("Martina");
    Person achim = new Person("Achim");
    Person paul = new Person("Paul");
    Person johanna = new Person("Johanna");
    Person lena = new Person("Lena");
    Person bernd = new Person("Bernd");
    Person magdalena = new Person("Magdalena");

        magdalena.setMutter(lena);
        magdalena.setVater(bernd);
        lena.setKind(magdalena);
        lena.setMutter(martina);
        lena.setVater(achim);
        bernd.setMutter(johanna);
        bernd.setVater(paul);
        bernd.setKind(magdalena);
        martina.setKind(lena);
        achim.setKind(lena);
        johanna.setKind(bernd);
        paul.setKind(bernd);
        return magdalena;
    }
```


----------



## kilopack15 (29. Okt 2016)

Hmm.. okay return magdalena macht Sinn. Aber warum bringst du die Methode erzeugeStammbaum() innerhalb der Klasse Person unter? (Zeile 1: public Person erzeugeStammbaum())

Und noch eine Frage:
Was ist mit den Konstruktoren aus Klasse Person:


```
public Person(String name, Person mutter, Person vater){
        this(name);
        this.mutter = mutter;
        this.vater = vater;
    }

    public Person(String name, Person mutter, Person vater, Person kind){
        this(name, mutter, vater);
        this.kind = kind;
    }
```

Warum werden die in der Methode erzeugeStammbaum() nicht genutzt?


----------



## JStein52 (29. Okt 2016)

kilopack15 hat gesagt.:


> Warum werden die in der Methode erzeugeStammbaum() nicht genutzt?


Hättest du auch machen können. Und sorry, die class-Zeile hatte ich weggelassen.


----------



## JStein52 (29. Okt 2016)

kilopack15 hat gesagt.:


> public Person erzeugeStammbaum()


Ach so du meinst deshalb wäre die in der Klasse Person ?  Nein, das heisst sie liefert eine Person (nämlich magdalena) zurück.


----------



## kilopack15 (29. Okt 2016)

Achso verstehe, ich hatte da "void" drinstehen, aber das ist ja Müll, es soll ja eine Person herauskommen, okay das macht Sinn! Wie würde man denn einen der Konstruktoren in der Methode erzeugeStammbaum() aufrufen? Hab es schon vergeblich versucht :/


----------



## JStein52 (29. Okt 2016)

Einen der Konstruktoren nutzt du ja, nämlich den mit dem Parameter name. Ein anderer würde z.B. so aussehen:


```
Person magdalena = new Person("Magdalena", lena, bernd);
```

Edit: damit sparst du dir die aufrufe:
magdalena.setMutter(...) und magdalena.setVater(...);


----------



## Xyz1 (29. Okt 2016)

kilopack15 hat gesagt.:


> Und noch eine Frage:
> Was ist mit den Konstruktoren aus Klasse Person:


Du kannst auch diese Konstruktoren benutzen/aufrufen. Aber damit das wenigsten halbwegs systematisch, aufgebaut wird.


----------



## kilopack15 (29. Okt 2016)

Ah verstehe! Eine Frage noch: was macht denn diese Funktion hier aus der Klasse Person?

```
public String toString(){
        return this.name;
    }
```


----------



## kaporalix (29. Okt 2016)

kilopack15 hat gesagt.:


> Ah verstehe! Eine Frage noch: was macht denn diese Funktion hier aus der Klasse Person?
> 
> ```
> public String toString(){
> ...


die methode gibt einfach den Name des Persons zurück
z.B bei :

```
Person martina = new Person("Martina");
```
bei System.out.println(martina) wird -> Martina  ausgegeben


----------



## JStein52 (29. Okt 2016)

kaporalix hat gesagt.:


> bei System.out.println(martina) wird -> Martina ausgegeben


Jetzt musst du ihm aber auch noch erklären wo hier toString() im Spiel ist


----------



## kilopack15 (29. Okt 2016)

Okay da hätte ich auch selbst drauf kommen können 
Danke !


----------

