Brauche Hilfe bei Java einfache verkettet Liste sortieren nach Zahlen?

4 Antworten

Das List-Interface gibt eine add-Methode vor, der du einen Index mitgeben kannst, an welcher Stelle ein neues Element angefügt werden soll.

Beispiel:

liste.add(0, abl);

Nun brauchst du nur noch den richtigen Index ermitteln, bevor du dein Element in der Liste einfügst. Eine lineare Suche reicht dafür aus: Laufe mit einer Schleife durch jedes Element (zähle dabei die Iterationen mit) und vergleiche dessen Zeitwert mit dem des neuen Elements. Sobald der Wert des neuen Elements kleiner/gleich ist (bei einer aufsteigenden Sortierung), kannst du die Schleife abbrechen, denn dann sollte die Position, an der du das Element einfügen musst, bekannt sein (die Iterationsanzahl + 1). Sollte der neue Wert größer als alle bisherigen Elemente sein, hängst du ihn einfach nur mit der anderen add-Überladung an.

Guten Tag, hier ein Lösungsvorschlag:

  • eine Klasse Abfahrtslaeufer
public class Abfahrtslaeufer {
    private double zeit;

    public Abfahrtslaeufer(double zeit) {
        this.zeit = zeit;
    }

    public double getZeit() {
        return zeit;
    }
}
  • die Klasse Abfahrerliste, effizienter gestaltet, mit ArrayList statt List
import java.util.ArrayList;

public class Abfahrerliste extends ArrayList<Abfahrtslaeufer>{

    public void einsortieren(Abfahrtslaeufer laeufer) {
        if (size() == 0 || laeufer.getZeit() > get(size()-1).getZeit()) {
            add(laeufer);
            return;
        }

        for (int i = 0; i < size(); ++i) {
            if (get(i).getZeit() > laeufer.getZeit()) {
                add(i, laeufer);
                return;
            }
        }
    }

    public StringBuilder ausgabe() {
        StringBuilder str = new StringBuilder();

        for (int i = 0; i < size();++i) {
            str.append("\nPlatz ").append(i + 1).append(": ").append(get(i).getZeit()).append(" sec");
        }

        return str;
    }
}
  • Die Main, mit dem Einsatz der Klassen
public class Main{

    public static void main(String str[]) {
        Abfahrerliste fahrer = new Abfahrerliste();

        for (int i = 0; i < 25; ++i) {
            fahrer.einsortieren(new Abfahrtslaeufer(Math.random() * 15));
        }

        System.out.println(fahrer.ausgabe());
    }
}
  • ein möglicher Output sieht wie folgt aus
Platz 1: 0.31540165694529554 sec
Platz 2: 0.7852411292903633 sec
Platz 3: 2.2208356378744103 sec
Platz 4: 2.466090375020565 sec
Platz 5: 2.511480295025641 sec
Platz 6: 3.050782679639643 sec
Platz 7: 3.1439025356077765 sec
Platz 8: 4.586975894366943 sec
Platz 9: 5.952322396728125 sec
Platz 10: 6.20986984489515 sec
Platz 11: 8.291353625155029 sec
Platz 12: 9.062008564473489 sec
Platz 13: 9.459937390658483 sec
Platz 14: 10.164536805288405 sec
Platz 15: 10.974369257112468 sec
Platz 16: 11.988129566114681 sec
Platz 17: 12.34852726101806 sec
Platz 18: 12.889422690469274 sec
Platz 19: 13.178368588854067 sec
Platz 20: 13.277326051649975 sec
Platz 21: 13.36513957994699 sec
Platz 22: 13.5755326552422 sec
Platz 23: 13.835144077321374 sec
Platz 24: 13.948430948036949 sec
Platz 25: 14.184765031740122 sec

Process finished with exit code 0

Bei weiteren Frage, kannst Du Dich gerne melden!

Grüße, Jacob

Bild zum Beitrag

Ich habe das jetzt so gemacht aber dadurch das bei sorted und current.next ein Fehler angezeigt wird kann ich nicht testen ob es funktioniert daher denke ich daß es falsch ist oder? Kann man die zwei Sachen irgendwie ändern damit es funktioniert?

 - (Computer, programmieren, Java)

Du könntest in der Methode die Liste einmal durchlaufen und immer die Zeiten vergleichen.

Wenn die Zeit des gerade in der Schleife betrachteten Elements größer (oder gleich?) als die Zeit des einzufügenden Elements ist, fügst du das Element davor ein und brichst die Schleife ab bzw. beendest die Funktion/Methode mit einem return.

Sollte es kein Element geben, welches eine größere Zeit hat als das einzufügende Element (Also du Schleife ist einmal durchgelaufen), dann fügst du es am Ende ein.

Pseudocode:

abl_time = abl.time
for (index, element in liste)
  if (element.time >= abl_time)
    liste.insert(abl, index) // in Java wäre es liste.add(index, abl)
    return;
liste.append(abl)
Woher ich das weiß:Studium / Ausbildung – Robotik und Autonome Systeme, Universität zu Lübeck