Forum: PC-Programmierung LinkedList.size(), komisches Verhalten (Java)


von Maxim (Gast)


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

von Maxim (Gast)


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?

von Flocki (Gast)


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.

von Maxim (Gast)


Lesenswert?

Aha, das ergibt Sinn. Ein Ausweg ist dann, "list" wieder mit den 
Objekten von "sorted" zu füllen, dann komme ich auch ohnre return aus.

Danke!

von Läubi .. (laeubi) Benutzerseite


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

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ich hoffe das ist irgendeine Uebung fuer die Schule... denn das Rad neu 
zu erfinden ist hier absolut nicht anzuraten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.