# ArrayList sortieren



## Kenta1561 (8. Okt 2016)

Hallo,

ich möchte gerne wissen, wie man einen ArrayList nach den Werten sortieren kann, und zwar speziell in diesem Fall:

Source-Code:
Main-Klasse:

```
package main;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        ArrayList<Node> al = new ArrayList<>();
        al.add(new Node("eins", 3));
        al.add(new Node("zwei", 1));
        al.add(new Node("drei", 5));
        al.add(new Node("vier", 2));
        for(Node x : al) {
            System.out.println("Name: " + x.getName() + ", Zeit: " + x.getTime());
            //Inhalt wird nach der Eingabe-Reihenfolge ausgegeben
        }
    }

}
```

Node-Klasse:

```
package main;

public class Node {

    private String name;
    private int time;

    public Node(String name, int time) {
        this.name = name;
        this.time = time;
    }

    public String getName() {
        return name;
    }

    public int getTime() {
        return time;
    }

}
```

Ich möchte, dass mein ArrayList "al" nach dem Integer-Wert "time" sortiert wird. Ich habe gerade herausgefunden, dass man "einfache" ArrayLists mit Integer, String etc. mit Collections.sort() sortieren kann, aber in diesem Fall speichere ich ja Instanzen von einer Klasse im ArrayList. Gibt es eine Möglichkeit, mein ArrayList nach getTime() zu sortieren?

LG
Kenta1561


----------



## mrBrown (8. Okt 2016)

Collections.sort nutzen und einen passenden Comperator für dein Objekt übergeben


----------



## Kenta1561 (8. Okt 2016)

@mrBrown

Ok, aber wie macht ich diesen Comperator?


----------



## DrZoidberg (8. Okt 2016)

Versuch mal Collections.sort(al, (n1, n2) -> n1.getTime() - n2.getTime())


----------



## Kenta1561 (8. Okt 2016)

@DrZoidberg
n1, n2?

EDIT: Oh, ich hab's jetzt


----------



## mrBrown (8. Okt 2016)

Wenn mans so mach aber statt `n1.getTime()-ne.getTime()` lieber `Integer.compare(n1.getTime(),n2.getTime())` nutzen


----------



## looparda (8. Okt 2016)

Ich bevorzuge an dieser Stelle

```
Collections.sort(al, Comparator.comparing(Node::getTime));
```
Kommt aber aufs gleiche raus.


----------



## mrBrown (8. Okt 2016)

Das ist auch die von mir präferierte Variante, allerdings glaube ich, das für den TE die alte Variante mit implements Comparator am einfachsten ist, wenn schon eine Liste zu sortieren zu Problemen führt...


----------



## Xyz1 (8. Okt 2016)

Ich bin ja für, man sollte erst imperativ beherrschen, bevor man sich funktional versucht. Vor Java8 sah das auch anders aus ---- UND NEIN, das möchte ich hier nicht sehen. (Aber gut, einmal gesagt, wird es auch gleich geschehen)


----------



## looparda (8. Okt 2016)

mrBrown hat gesagt.:


> Das ist auch die von mir präferierte Variante, allerdings glaube ich, das für den TE die alte Variante mit implements Comparator am einfachsten ist


Ich verstehe das nicht. Es wird doch die compareTo von Integer aufgerufen, wobei Integer Comparable implementiert.


----------



## mrBrown (8. Okt 2016)

looparda hat gesagt.:


> Ich verstehe das nicht. Es wird doch die compareTo von Integer aufgerufen, die Comparable implementiert.





looparda hat gesagt.:


> Ich verstehe das nicht. Es wird doch die compareTo von Integer aufgerufen, die Comparable implementiert.



Comparable != Comparator


----------



## looparda (8. Okt 2016)

Das habe ich auch nicht gesagt. Ich weiß nicht ob wir das hier zur Verwirrung diskutieren sollten. Gab's hier nicht mal einen Chat?


----------



## Xyz1 (8. Okt 2016)

mrBrown hat gesagt.:


> Wenn mans so mach aber statt


Auch mal auf den Kontext schauen, es handelt sich wahrscheinlich immer um Zeiten seit... d. h. das ist eine völlig unnötige Bemerkung.


----------



## looparda (8. Okt 2016)

DerWissende hat gesagt.:


> Auch mal auf den Kontext schauen, es handelt sich wahrscheinlich immer um Zeiten seit... d. h. das ist eine völlig unnötige Bemerkung.


Ich finde man darf so etwas dennoch vorschlagen. Der TE kann sich alle Varianten anschauen und vergleichen. Ich habe versucht im Kontrast die generischste Lösung aufzuzeigen, die keine Änderung am Code bei Änderung des Datentyps benötigt.


----------



## mrBrown (8. Okt 2016)

DerWissende hat gesagt.:


> Auch mal auf den Kontext schauen, es handelt sich wahrscheinlich immer um Zeiten seit... d. h. das ist eine völlig unnötige Bemerkung.


Keine Ahnung was da drin Kontext ist, aber meiner ist zwei Werte vergleichen (völlig unabhängig was die darstellen), und dafür nutzt man einfach Methoden zum vergleichen.

Kontext und so, Vergleich passt einfach besser zum Vergleich und minus besser zum Rechnen.


----------



## Xyz1 (8. Okt 2016)

looparda hat gesagt.:


> Ich finde man darf so etwas dennoch vorschlagen. Der TE kann sich alle Varianten anschauen und vergleichen.


Dadurch hat er sicher viel selber erlernt und begriffen.


----------



## looparda (8. Okt 2016)

DerWissende hat gesagt.:


> Dadurch hat er sicher viel selber erlernt und begriffen.


Wer Java verstehen möchte muss sich auf Kurz oder Lang auch mit so etwas auseinandersetzen. Ich denke wenn man diese Ansätze immerhin schon mal gesehen hat ist das schon ein Mehrwert.


----------

