Array sortieren

Willi.We

Neues Mitglied
Hallo erstmals,
ich habe ein Array für Wetterstationen mit 4 Einträgen, der erste mit der ID, der zweite und dritte speichert die Koordinaten und der vierte Eintrag gibt an, wie weit die Station von einem Ort entfernt ist.
So speichere ich das:
array_stationen [0] [e] = station_id;
array_stationen [1] [e] = station_Breite;
array_stationen [2] [e] = station_Länge;
array_stationen [3] [e] = Entfernung;


Das e gibt die Wetterstationen an.

Ich würde gerne die ganzen Einträge nach dem vierten Wert, also der Entfernung sortieren, sodass ich ganz oben meine nächste Wetterstation stehen habe. Ist das möglich?
 
Zuletzt bearbeitet:
Beste Antwort
Ach, ich habe wohl übersehen, dass du ein zweidimensionales Array hast. Weißt du denn, wie du aufsteigend sortieren kannst, z. B. mit Bubblesort? Dann iteriere über alle Elemente der vierten Spalte und beim Tauschen der Elemente musst du die anderen Spalten einfach mit tauschen.

Klassen und OOP gehört zu den Java-Grundlagen. Ich würde dir empfehlen dir zunächst diese Grundlagen anzueignen, bevor du hier weiter arbeitest.
Wenn du das so speicherst, dann hast du in dem Array mit vier Einträgen doch nur eine Wetterstation gespeichert?

Was willst du da noch sortieren?

Besser wäre es, wenn du für die Wetterstation eine eigene Klasse verwendest und dann ein Array von Wetterstationen hast.
 
Ich habe um die 70 Wetterstationen gespeichert, diese sollen nach dem vierten Wert (Entfernung) aufwärts sortiert werden.
Das mit der eigenen Klasse, wie man das macht müsst ich mir anschauen, hast du vielleicht einen Link, wo das erklärt wird?
 
Ach, ich habe wohl übersehen, dass du ein zweidimensionales Array hast. Weißt du denn, wie du aufsteigend sortieren kannst, z. B. mit Bubblesort? Dann iteriere über alle Elemente der vierten Spalte und beim Tauschen der Elemente musst du die anderen Spalten einfach mit tauschen.

Klassen und OOP gehört zu den Java-Grundlagen. Ich würde dir empfehlen dir zunächst diese Grundlagen anzueignen, bevor du hier weiter arbeitest.
 
Beste Antwort
Sortierung muss man nicht selbst implementieren, Java bringt da schon einiges mit. Du kannst mit Hilfe einer Comparator-Klasse so ziemlich alles nach allem möglichen sortieren. Dein zu sortierendes Objekt kann auch das Interface Comparable implementieren, dies empfiehlt sich für die Standardsortierung. Hier mal ein Beispiel:

Java:
public class App {

    private static class WeatherStation {

        private double distance;

        public double getDistance() {
            return distance;
        }

        public void setDistance(double distance) {
            this.distance = distance;
        }

        // mehr getter / setter
    }

    private static class DistanceComparator implements Comparator<WeatherStation> {
        public int compare(WeatherStation o1, WeatherStation o2) {
            return Double.compare(o1.getDistance(), o2.getDistance());
        }
    }

    public static void main(String[] args) {

        // Liste zufälliger Werte
        List<WeatherStation> list = new ArrayList<>(100);
        for (int i = 0; i < 100; i++) {
            double randomDistance = ThreadLocalRandom.current().nextDouble(1D, 100D);
            WeatherStation station = new WeatherStation();
            station.setDistance(randomDistance);
            list.add(station);
        }

        // Sortierung
        Collections.sort(list, new DistanceComparator());
        // Ausgabe
        list.forEach(e -> System.out.printf("List-Distanz: %s\n", e.getDistance()));

        // Array zufälliger Werte
        WeatherStation[] stations = new WeatherStation[100];
        for (int i = 0; i < 100; i++) {
            double randomDistance = ThreadLocalRandom.current().nextDouble(1D, 100D);
            WeatherStation station = new WeatherStation();
            station.setDistance(randomDistance);
            stations[i] = station;
        }
        // Sortierung
        Arrays.sort(stations, new DistanceComparator());
        // Ausgabe
        for (WeatherStation station : stations) {
            System.out.printf("Array-Distanz: %s\n", station.getDistance());
        }

    }

}
Mehr Infos dazu findest du z.B. hier: https://openbook.rheinwerk-verlag.d...09_001.htm#mj3ddd02b9666d4fc340fdb6405a0f3616
 
Zuletzt bearbeitet:
temis Antwort ist schon mal ganz gut, Oneixee5's Lösung mit Datentyp an statt Array gefällt mir noch besser.

Aber falls du bei einem 2D-Array bleiben willst ...
Du kannst das Ganze noch etwas optimieren, indem du dann nicht jeden einzelnen Feldinhalt vertauschst, sonden den Eintrag für die "Zeile" in der Referenz auf das 2D-Array.
Java:
//Ich hab hier mal Object angenommen, setzt hier einfach ein, was du verwendest
Object[]temp = array_station[i]
array_station[i] = arraystation[j]
arraystation[j] = temp

Noch besser: Schreib eine einfache compare-Methode und lass das Array dann mit Arrays.sort sortieren.
Java:
//auch hier Annahme Object[]
private int compareByDistance(Object[] e1, Object[] e2) {
    return Double.compare((double)e1[3],(double) e2[3]);
}
Arrays.sort(array_station, this::compareByDistance);
Das ist allerdings sehr spezifisch auf genau dieses Arraystruktur ausgelegt. Einen eigenen Datentyp für jeden Eintrag zu verwenden, ist in jedem Fall besser.

Ich gehe mal davon aus, dass ihr gerade lernen müsst, mit Arrays umzugehen 🙂
Auf diese Art wirst du später nicht mehr arbeiten wollen. Auch wirst du im Normalfall Listen und keine Arrays verwenden.
 

Zurück
Oben