LinkedList.size(), komisches Verhalten (Java)

Gast #1130252
Lesenswert?

1
    public static void sort(LinkedList<Fraction> list)
2
    {
3
        LinkedList sorted = new LinkedList();
4
        while(!list.isEmpty())
5
        {
6
            Fraction min = Fraction.takeMin(list);
7
            sorted.add(min); 
8
        }
9
        System.out.println("x1 "+ list.size());
10
        list = sorted;
11
        System.out.println("x2 "+ sorted.size());
12
        System.out.println("x3 "+ list.size());
13
    }
Die Methode sortiert eine Liste. Zuert wird eine neue Liste "sorted" 
erstellt und dann werden nach und nach aus der alten Liste "list" die 
kleinsten Objekte der Klasse "Fraction" rausgenommen und an "sorted" 
drangehöngt. Zum Schluß bekommt "list" die Referenz von "sorted". Die 
Testausgaben x1 = 0, x2 = 7 und x3 = 7 sind bei einer Beispielliste der 
Länge 7 korrekt. Die Liste "list" ist ja am Ende leer, da ich mit der 
Methode Fraction.takeMin(list) alle Objekte rausgenommen habe. Wenn ich 
nun diese Methode von irgendwo anders aufrufe, bekomme ich eine Liste 
der Länge 0 zurück. Ich kann mir das gar nicht erklären. Was passiert 
da? Ganz am Ende der Methode hat die Liste noch die Länge 7 und gleich 
danach 0. Merkwürdig ...
Gast #1130270
Lesenswert?

Nachtrag: Wenn ich "list" oder "sorted" mit return zurückgebe, hat die 
Liste Länge 7. Kann es sein, dass beim Beender der Methode alle Objekte 
aus den Listen aus irgendeinem Grund gelöscht werden?
Gast #1130288
Lesenswert?

Du darfst Argumente in einer Methode nicht neu zuweisen, denn der 
Aufrufer bekommt von der neuen Referenz (Speicherstelle) nix mit. Darum 
arbeitet der Aufrufer nach der Methode immer noch mit der ersten Liste, 
die ja mittlerweile leer ist.

Per Rückgabewert geht es, wie du selbst ja schon herausgefunden hast.
Persönliche Seite #1130339
Lesenswert?

Ein viel besserer Ausweg ist die Collections API die dir die Möglichkeit 
gibt eine Liste einzugeben und diese sortiert zurückzuerhalten. Du mußt 
nur das Comparator Interface in deiner Klasse Fraction implementieren.
Vorteil ist, das du damit auf jedenfall schneller bist und du sparrst 
dir das ständige umkopieren.

Alterantiv kannst du auch die Sort Methode mit einem Komperator aufrufen 
falls dir das lieber ist.

http://java.sun.com/j2se/1.3/docs/api/java/util/Collections.html

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren