Wie wäre es mit der Baumkarte unten:
Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
Was auch immer Sie in diese sortedMap eingeben, es wird automatisch sortiert. Zuallererst TreeMap
ist eine sortierte Implementierung von Map
Schnittstelle. Es gibt ein Aber, da es die Schlüssel in [natürlicher Reihenfolge][https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html] sortiert. Wie das Java-Dokument sagt String
Typ ist ein lexikografischer Typ mit natürlicher Ordnung. Stellen Sie sich die folgende Liste von Zahlen mit dem Typ String vor. Das bedeutet, dass die folgende Liste nicht wie erwartet sortiert wird.
List<String> notSortedList = List.of("78","0", "24", "39", "4","53","32");
Wenn Sie nur den Standard TreeMap
Konstruktor wie unten und schieben jedes Element einzeln wie unten:
Map<String, String> map = new TreeMap<>();
for (String s : notSortedList) {
map.put(s, s);
}
System.out.println(map);
Ausgabe ist: {0=0, 14=14, 24=24, 32=32, 39=39, 4=4, 48=48, 53=53, 54=54, 78=78}
Wie Sie sehen, Nummer 4 kommt zum Beispiel nach '39'. Dies liegt in der Natur der lexikografischen Datentypen wie String. Wenn es sich um einen Integer-Datentyp handelte, war das allerdings in Ordnung.
Um dies zu beheben, verwenden Sie das Argument, um zuerst die Länge der Zeichenkette zu überprüfen und sie dann zu vergleichen. In Java 8 wird dies wie folgt gemacht:
Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
Es vergleicht zunächst jedes Element nach Länge und wendet dann die Prüfung nach compareTo
als Eingabe dasselbe wie das Element, mit dem verglichen werden soll.
Wenn Sie es vorziehen, eine verständlichere Methode zu verwenden, ist der obige Code gleichwertig mit dem folgenden Code:
Map<String, String> sortedMap = new TreeMap<>(
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int lengthDifference = o1.length() - o2.length();
if (lengthDifference != 0) return lengthDifference;
return o1.compareTo(o2);
}
}
);
Weil die TreeMap
Konstruktor die Komparatorschnittstelle akzeptiert, können Sie eine noch komplexere Implementierung von Composite-Klassen erstellen.
Dies ist auch eine andere Form der vereinfachten Version.
Map<String,String> sortedMap = new TreeMap<>(
(Comparator<String>) (o1, o2) ->
{
int lengthDifference = o1.length() - o2.length();
if (lengthDifference != 0) return lengthDifference;
return o1.compareTo(o2);
}
);