Collection.sort sortiert nicht

Diskutiere Collection.sort sortiert nicht im Java Basics - Anfänger-Themen Bereich.
M

mark.1098

Hallo,

ich bin Java Anfänger und arbeite an einem Projekt in dem ein Hamster (paule) simuliert wird der Körner (grain) einsammeln soll. Es sollen sich die Anzahl aller Körner die Pro gelaufenen Schritt eingesammelt wurden gemerkt werden. Diese sollen einer ArrayList hinzugefügt und anschließend sortiert werden. Hierfür habe ich eine ArrayList erstellt die Integer Werte (für die Anzahl der eingesammelten Körnern pro gelaufenen Schritt) speichert und einen grainCounter der zählt wieviele Körner pro Schritt gesammelt wurden. Das speichern der Körneranzahl pro Schritt funktioniert, jedoch möchte ich dass die ArrayList mit allen Integer Werten der Größe nach sortiert wird was ich mit Collection.sort versucht habe. allerdings wird mir nach Ausführung der Operation meine ursprüngliche Liste und nicht die sortierte auf der Konsole ausgegeben. Vorab schonmal danke für euere Hilfe.


Java:
    @Override
    protected void run() {

        List<Integer> grains = new ArrayList<>();

        int grainCounter = 0;

        while (paule.grainAvailable()) {

            paule.pickGrain();
            grainCounter++;
        }
        grains.add(grainCounter);

        if (paule.frontIsClear()) {
            paule.move();
            run();

        }

        Collections.sort(grains);
        System.out.println(grains);
    }
 
mihe7

mihe7

Wenn Du uns auch noch Code zeigen würdest... (zum Einfügen bitte Code-Tags verwenden: die drei Punkte neben dem Smiley -> Code -> Java).
 
J

JustNobody

Das Problem ist, dass Du dir alles in lokalen Variablen merkst:
Java:
protected void run() {

        List<Integer> grains = new ArrayList<>(); // Lokale Variable!

        // Viel gekürzt ....
    
        run(); // Rekurisver Aufruf -> hier wird dann eine neue lokale Variable verwendet ...
    
        // Viel gekürzt ....
    }
Was Du machen kannst ist, dass du statt einer lokalen Variable eine Instanzvariable nutzt. Dann verwenden alle Aufrufe von run die gleiche Instanz von ArrayList.

Oder wenn es Probleme mit Initialisierung und co gibt (Sollte aber nicht der Fall sein, denn es sieht so aus, als hättest Du einen Thread oder Runnable und den wirst Du wohl nicht mehrfach verwenden ohne ihn neu zu erstellen), teilst Du es auf in zwei Methoden:
Java:
    @Override
    protected void run() {
        List<Integer> grains = new ArrayList<>();
        run(grains);
    }

    protected void run(List<Integer> grains) {
        List<Integer> grains = new ArrayList<>();
       int grainCounter = 0;

        while (paule.grainAvailable()) {

            paule.pickGrain();
            grainCounter++;
        }
        grains.add(grainCounter);

        if (paule.frontIsClear()) {
            paule.move();
            run(grains);

        }

        Collections.sort(grains);
        System.out.println(grains);
    }
(Ungetestet - aber da würde dann auch nur einmal grains erstellt und dann immer als Parameter mitgegeben.)
 
X

Xyz1

Du solltest zusätzlich noch einen Index speichern
Java:
int index = 1;
List<int[]> grains = new ArrayList<>();

for (int j = 0; j < 10; j++) {
	int grainCounter = 0;

	// while (paule.grainAvailable()) {
	for (int i = new Random().nextInt(10); i < 10; i++) {
		// paule.pickGrain();
		grainCounter++;
	}
	grains.add(new int[] { index, grainCounter });
	index++;

	// if (paule.frontIsClear()) {
	// paule.move();
	// run(); (???)
	// }
}

grains.forEach(g -> System.out.print(Arrays.toString(g) + " "));
System.out.println("");
Collections.sort(grains, (o1, o2) -> o2[1] - o1[1]);
grains.forEach(g -> System.out.print(Arrays.toString(g) + " "));
System.out.println("");
 
J

JustNobody

Als kleine Ergänzung: Du hast in jedem rekursiven Run Aufruf eine Ausgabe der Liste. Somit hast Du keine unsortierte Liste ausgegeben bekommen sondern Du hast lauter einzelner Listen mit jeweils einem Element ausgegeben bekommen. Und das in verkehrter Reihenfolge, da die Ausgabe erst nach dem rekursiven Aufruf erfolgte....

Also erstes Feld: 1 KOrn aufgehoben, also enthält die Liste nur die 1.
1. Rekursion: zweites Feld, mal 2 Körner angenommen: Also liste hier enthält die 2 (Eigenständige Liste wie schon erläutert)
2. Rekursion: drittes Feld, mal 3 Körner angenommen: Also Liste bekommt die 3.
--> Jetzt kein Feld mehr da, also keine weitere Rekursion
2. Rekursion: Ausgabe: "3" und Rücksprung
1. Rekursion: Ausgabe "2" und Rücksprung
Hauptaufruf: Ausgabe der "1" und fertig
 
mihe7

mihe7

Wenn Du uns auch noch Code zeigen würdest... (zum Einfügen bitte Code-Tags verwenden: die drei Punkte neben dem Smiley -> Code -> Java).
Hallo?!? Kann mir mal einer verraten, warum beim Beitrag des TE nicht steht, dass er bearbeitet wurde? Zuerst hing da ein PDF dran, das bei meinem Versuch, es anzuzeigen, nicht mehr gefunden werden konnte. Nach einem Reload war der Anhang entfernt und der Kommentar bestand nur noch aus dem Text ohne Code.
 
mrBrown

mrBrown

Hallo?!? Kann mir mal einer verraten, warum beim Beitrag des TE nicht steht, dass er bearbeitet wurde? Zuerst hing da ein PDF dran, das bei meinem Versuch, es anzuzeigen, nicht mehr gefunden werden konnte. Nach einem Reload war der Anhang entfernt und der Kommentar bestand nur noch aus dem Text ohne Code.
Gefühlt kann man in den ersten 5 Minuten ohne den Hinweis bearbeiten, @Flown kann da vielleicht mehr zu sagen.
 
Thema: 

Collection.sort sortiert nicht

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben