[Java] Kennt Beziehungen in Reihe?!

11/11/2011 14:02 Belur#1
Hey E*pvpers.

Habe zu folgendem Beispielquelltext ein Problem:

PHP Code:
/**
 * Write a description of class Buecherkeller here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Buecherkeller
{
    public 
Buch erstesBuch;

    
/**
     * Constructor for objects of class Buecherkeller
     */
    
public Buecherkeller()
    {
        
erstesBuch = new Buch("0"0,0);

    }

    public 
void neuesBuch(String titelint jahrint buchnummer){

        
Buch neuesBuch = new Buch(titeljahrbuchnummer);

        
erstesBuch.nachfolger neuesBuch;
     
        
    }



Erstelle ich weitere Bücher, verweißt das erste Buch immer auf das letzte erstellte. Die anderen sind dann weg O.o Ja mir ist klar warum aber ich weiß nicht wie ich mein eigentliches Ziel erreiche:


Möchte das eig so haben, dass das erste auf das zweite, das zweite auf das dritte, das dritte auf das vierte Buch etc verweißt.

Weiß leider nicht genau wies umsetzbar ist.

Hoffe mir kann jmd helfen.

~Belur
11/11/2011 19:39 ms​#2
Du kannst deine Liste in einer Schleife einfach durchgehen, bis du auf ein Buch ohne Nachfolger stößt. Ich habe keine Ahnung von Java, aber in C würde das in etwa so aussehen:

Code:
Buch diesesBuch = erstesBuch;      /* gehe an den Anfang der Bücherliste */
while (diesesBuch.nachfolger)      /* gehe die Liste so lange durch bis das letzte Buch (= kein Nachfolger) gefunden wurde */
    diesesBuch = diesesBuch.nachfolger;
diesesBuch.nachfolger = neuesBuch; /* füge neues Buch an das Ende der Liste hinzu */
11/12/2011 00:12 MrSm!th#3
In Java nicht viel anders, nur dass man nen Zeiger nicht einfach so in nen Bool konvertieren kann :P Man müsse halt while ... != null schreiben.

Aber warum verweist ein Buch auf seinen Nachfolger? oO Das ist kein sehr schönes Design, da würde sich eine Linked-List viel mehr anbieten, in die man dann die Buch-Objekte einfügt.
11/12/2011 00:23 ms​#4
Quote:
Originally Posted by MrSm!th View Post
Aber warum verweist ein Buch auf seinen Nachfolger? oO Das ist kein sehr schönes Design, da würde sich eine Linked-List viel mehr anbieten, in die man dann die Buch-Objekte einfügt.
Das ist eine Linked List. ;O
11/12/2011 11:38 MrSm!th#5
Ist es nicht, weil die Bücher etwas davon wissen.
Eine Linked-List wäre eine Liste, in die man die Bücher einfügt und dieses ganze Nachfolgergedöns übernehmen Wrapper Klassen (oft Knoten genannt), sodass die eigene Klasse davon nichts wissen muss.

Hier hat er nun die Klasse Buch, welches aber gleichzeitig noch seinen Nachfolger kennt, was weder designtechnisch schön ist noch der Realität wirklich entspricht, was ja möglichst bei einem OO Design der Fall sein soll.
11/12/2011 12:20 xNopex#6
Quote:
aber in C würde das in etwa so aussehen:

Code:

Buch diesesBuch = erstesBuch; /* gehe an den Anfang der Bücherliste */
while (diesesBuch.nachfolger) /* gehe die Liste so lange durch bis das letzte Buch (= kein Nachfolger) gefunden wurde */
diesesBuch = diesesBuch.nachfolger;
diesesBuch.nachfolger = neuesBuch; /* füge neues Buch an das Ende der Liste hinzu */
Die Liste ist eine rekursive Datenstruktur, deswegen wird man sie nicht iterativ durchlaufen.

Quote:
Aber warum verweist ein Buch auf seinen Nachfolger? oO Das ist kein sehr schönes Design
Bei ihm wird die Datenstruktur wahrscheinlich gerade eingeführt, da wird das üblicherweise so gelehrt. Später wird das weiter abstrahiert und dann über ein Interface die eigentlichen Daten von den "Knoten" getrennt.

B2T:
Du hast zwei Klassen. Die eine hat nur! eine Referenz auf das erste Element der Liste. Die andere Klasse sind die Elemente der Liste und haben jeweils eine Referenz nur! auf ihren Nachfolger. Willst du ein Element hinten in der Liste einfügen rennst du rekursiv durch und lässt dein letztes Element ein neues Element erstellen und setzt den als neuen Nachfolger fest. That's it.


EDIT:
Evtl. so:
Code:
public class Buecherkeller{
    public Buch erstesBuch;

    public Buecherkeller(){
        erstesBuch = new Buch("0", 0,0);
    }

    public void neuesBuch(String titel, int jahr, int buchnummer){

        Buch newBook = new Buch(titel, jahr, buchnummer);
        if(erstesBuch != null){
            erstesBuch.neuesBuch(newBook);
        }
     }
}

public class Buch{
    private Buch nachfolger;
    //...ctor etc. mal weggelassen
    public void neuesBuch(Buch neu){
        if(nachfolger == null){
            nachfolger = neu;
        }else{
            nachfolger.neuesBuch(neu);
        }
    }
}
Habs ausm Kopf geschrieben, können fehler drinnen sein. Und mit Kompositum wärs natürlich noch schöner, aber das würde das Maß an der Stelle sprengen.