Arrays in Java sortieren

Arrays in Java sortieren

1. Überblick

In diesem Tutorial werden allgemeine Methoden zum Sortieren vonarrays in aufsteigender und absteigender Reihenfolge erläutert.

Wir werden uns die Verwendung der KlassensortierungsmethodeArraysvon Java sowie die Implementierung unserer eigenenComparator ansehen, um die Werte unserer Arrays zu ordnen.

2. Objektdefinitionen

Bevor wir beginnen, definieren wir kurz einige Arrays, die wir in diesem Tutorial sortieren werden. Zuerst erstellen wir ein Array vonints und ein Array von Zeichenfolgen:

int[] numbers = new int[] { -8, 7, 5, 9, 10, -2, 3 };
String[] strings = new String[] { "learning", "java", "with", "example" };

Erstellen wir außerdem ein Array vonEmployee -Objekten, in denen jeder Mitarbeiter einid -Sand- und einname -Sattribut hat:

Employee john = new Employee(6, "John");
Employee mary = new Employee(3, "Mary");
Employee david = new Employee(4, "David");
Employee[] employees = new Employee[] { john, mary, david };

3. Aufsteigend sortieren

Dieutil.Arrays.sort-Methode von Java bietet uns eine schnelle und einfache Möglichkeit, ein Array von Grundelementen oder Objekten zu sortieren, die dieComparable-Schnittstelle in aufsteigender Reihenfolge implementieren.

Beim Sortieren von Grundelementen verwendet dieArrays.sort -Smethod eine Dual-Pivot-Implementierung vonQuicksort. Beim Sortieren von Objekten wird jedoch eine iterative Implementierung vonMergeSort verwendet.

3.1. Primitive

Um ein primitives Array in aufsteigender Reihenfolge zu sortieren, übergeben wir unser Array an diesort -Smethod:

Arrays.sort(numbers);
assertArrayEquals(new int[] { -8, -2, 3, 5, 7, 9, 10 }, numbers);

3.2. Objekte, die vergleichbare implementieren

Für Objekte, die dieComparable -Sinterschnittstelle implementieren, wie bei unserem primitiven Array, können wir unser Array auch einfach an diesort-Methode übergeben:

Arrays.sort(strings);
assertArrayEquals(new String[] { "example", "java", "learning", "with" }, strings);

3.3. Objekte, die nicht vergleichbar sind

Um Objekte zu sortieren, die dasComparable Interface nicht implementieren, wie z. B. unser Array vonEmployees, müssen wir unseren eigenen Komparator angeben.

Wir können dies in Java 8 sehr einfach tun, indem wir die Eigenschaft angeben, mit der wir unsereEmployee -Objekte innerhalb unsererComparator: vergleichen möchten

Arrays.sort(employees, Comparator.comparing(Employee::getName));
assertArrayEquals(new Employee[] { david, john, mary }, employees);

In diesem Fall haben wir angegeben, dass wir unsere Mitarbeiter nach ihrenname -Sattributen ordnen möchten.

Wir können unsere Objekte auch nach mehr als einem Attribut sortieren, indem wir unsere Vergleiche mitComparator’s thenComparing method verketten:

Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId));

4. In absteigender Reihenfolge sortieren

4.1. Primitive

Das Sortieren eines primitiven Arrays in absteigender Reihenfolge ist nicht ganz so einfach wie das Sortieren in aufsteigender Reihenfolge, da Java die Verwendung vonComparators on-Primitivtypen nicht unterstützt. Um dieses Defizit zu beheben, haben wir einige Möglichkeiten.

Erstens könnten wirsort our array in ascending order and then do an in-place reversal des Arrays.

Zweitens könnte unser Array in eine Listeuse Guava’s Lists.reverse() method konvertieren und dann unsere Liste wieder in ein Array konvertieren.

Schließlich könnten wir unser Array in einenStream and umwandeln und es dann wieder einemint Array zuordnen. Es hat den schönen Vorteil,a one-liner and just using core Java: zu sein

numbers = IntStream.of(numbers).boxed().sorted(Comparator.reverseOrder()).mapToInt(i -> i).toArray();
assertArrayEquals(new int[] { 10, 9, 7, 5, 3, -2, -8 }, numbers);

Der Grund dafür ist, dassboxed jedesint in einInteger verwandelt, dasdoesComparator. implementiert

4.2. Objekte, die vergleichbare implementieren

Das Sortieren eines Objektarrays, das dieComparable -Sinterschnittstelle in absteigender Reihenfolge implementiert, ist recht einfach. Alles was wir tun müssen, ist einComparator als zweiten Parameter unserersort Methode zu übergeben.

In Java 8 können wirComparator.reverseOrder() verwenden, um anzugeben, dass unser Array in absteigender Reihenfolge sortiert werden soll:

Arrays.sort(strings, Comparator.reverseOrder());
assertArrayEquals(new String[] { "with", "learning", "java", "example" }, strings);

4.3. Objekte, die nicht vergleichbar sind

Ähnlich wie beim Sortieren von Objekten, die vergleichbare implementieren, können wir die Reihenfolge unserer benutzerdefiniertenComparator  umkehren, indem wirreversed() am Ende unserer Vergleichsdefinition hinzufügen:

Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed());
assertArrayEquals(new Employee[] { mary, john, david }, employees);

5. Fazit

In diesem Artikel haben wir diskutiert, wie Arrays von Primitiven und Objekten in aufsteigender und absteigender Reihenfolge mit der MethodeArrays.sort sortiert werden.

Der Quellcode aus diesem Artikel befindet sich wie gewohnt inover on Github.