Finden von Min / Max in einem Array mit Java

1. Einleitung

In diesem kurzen Tutorial erfahren Sie, wie Sie mithilfe der Stream- API von Java 8 die Maximal- und Minimalwerte in einem Array ermitteln .

Wir beginnen damit, das Minimum in einem Array von Ganzzahlen zu finden, und dann finden wir das Maximum in einem Array von Objekten.

2. Übersicht

Es gibt viele Möglichkeiten, den Min- oder Max-Wert in einem ungeordneten Array zu ermitteln, und alle sehen ungefähr so ​​aus:

SET MAX to array[0] FOR i = 1 to array length - 1 IF array[i] > MAX THEN SET MAX to array[i] ENDIF ENDFOR

Wir werden uns ansehen, wie Java 8 diese Details vor uns verbergen kann . In Fällen, in denen die Java-API nicht zu uns passt, können wir jederzeit zu diesem grundlegenden Algorithmus zurückkehren.

Da wir jeden Wert im Array überprüfen müssen, sind alle Implementierungen O (n) .

3. Den kleinsten Wert finden

Die Schnittstelle java.util.stream.IntStream bietet die min- Methode , die für unsere Zwecke einwandfrei funktioniert.

Da wir nur mit ganzen Zahlen arbeiten, benötigt min keinen Komparator :

@Test public void whenArrayIsOfIntegerThenMinUsesIntegerComparator() { int[] integers = new int[] { 20, 98, 12, 7, 35 }; int min = Arrays.stream(integers) .min() .getAsInt(); assertEquals(7, min); }

Beachten Sie, wie wir das Integer- Stream-Objekt mit der statischen Stream- Methode in Arrays erstellt haben . Für jeden primitiven Array-Typ gibt es äquivalente Stream- Methoden.

Da das Array leer sein könnte, gibt min ein Optional zurück . Um dies in ein int zu konvertieren , verwenden wir getAsInt .

4. Finden des größten benutzerdefinierten Objekts

Lassen Sie uns ein einfaches POJO erstellen:

public class Car { private String model; private int topSpeed; // standard constructors, getters and setters }

Und dann können wir die Stream- API erneut verwenden, um das schnellste Auto in einer Reihe von Autos zu finden :

@Test public void whenArrayIsOfCustomTypeThenMaxUsesCustomComparator() { Car porsche = new Car("Porsche 959", 319); Car ferrari = new Car("Ferrari 288 GTO", 303); Car bugatti = new Car("Bugatti Veyron 16.4 Super Sport", 415); Car mcLaren = new Car("McLaren F1", 355); Car[] fastCars = { porsche, ferrari, bugatti, mcLaren }; Car maxBySpeed = Arrays.stream(fastCars) .max(Comparator.comparing(Car::getTopSpeed)) .orElseThrow(NoSuchElementException::new); assertEquals(bugatti, maxBySpeed); }

In diesem Fall wird der statische Methode Strom von Arrays gibt eine Instanz der Schnittstelle java.util.stream.Stream wobei das Verfahren max A erfordert Vergleicher .

Wir hätten unseren eigenen benutzerdefinierten Komparator erstellen können , aber der Vergleich ist viel einfacher.

Beachten Sie erneut, dass max aus demselben Grund wie zuvor eine optionale Instanz zurückgibt .

Wir können entweder bekommen diesen Wert, oder wir können , was sonst noch möglich ist , mit Optional s, wie orElseThrow , die eine Ausnahme auslöst , wenn max keinen Wert zurückgibt.

5. Schlussfolgerung

In diesem kurzen Artikel haben wir gesehen, wie einfach und kompakt es ist, mithilfe der Stream- API von Java 8 Max und Min in einem Array zu finden .

Weitere Informationen zu dieser Bibliothek finden Sie in der Oracle-Dokumentation.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie auf GitHub.