Wie beginne ich diese Aufgabe?

kilopack15

Aktives Mitglied
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:
info2.jpg
Zum Verständnis: Martina und Achim haben das Kind Lena.

Klasse Person:

Java:
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;
    }
 
Zuletzt bearbeitet von einem Moderator:
X

Xyz1

Gast
Schöne Aufgabe, so funktioniert's:
Java:
/**
 * @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());
        }
    }
}

Code:
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. :D
 

kilopack15

Aktives Mitglied
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?
 
X

Xyz1

Gast
Ja,
Java:
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
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
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

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

Code:
            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:
Code:
magdalena.setMutter(lena);
magdalena.setVater(bernd);

usw.
und am Ende steht return magdalena;
 
X

Xyz1

Gast
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

Mitglied
ok so würde ich es Klasse Standesamt implementieren:

Java:
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:


Java:
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);
        ....
    }

}
 

JStein52

Top Contributor
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.
 

kilopack15

Aktives Mitglied
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!

Java:
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

Top Contributor
Ich hätte es so gemacht:

Code:
    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

Aktives Mitglied
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:

Code:
    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?
 

kilopack15

Aktives Mitglied
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 :/
 
Zuletzt bearbeitet:

JStein52

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

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

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

kilopack15

Aktives Mitglied
Ah verstehe! Eine Frage noch: was macht denn diese Funktion hier aus der Klasse Person?
Java:
   public String toString(){
        return this.name;
    }
 

kaporalix

Mitglied
Ah verstehe! Eine Frage noch: was macht denn diese Funktion hier aus der Klasse Person?
Java:
   public String toString(){
        return this.name;
    }
die methode gibt einfach den Name des Persons zurück
z.B bei :
Java:
Person martina = new Person("Martina");
bei System.out.println(martina) wird -> Martina ausgegeben
 

Neue Themen


Oben