Min/Max in einem Array mit Java suchen

Finden von Min / Max in einem Array mit Java

1. Einführung

In diesem kurzen Tutorial erfahren Sie, wie Sie die Maximal- und Minimalwerte in einem Array mithilfe derStream-API von Java 8 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. Überblick

Es gibt viele Möglichkeiten, den min- oder max-Wert in einem ungeordneten Array zu finden, 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, wieJava 8 can hide these details from us. 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 ImplementierungenO(n).

3. Den kleinsten Wert finden

The java.util.stream.IntStream interface provides the min method, die für unsere Zwecke gut funktionieren.

Da wir nur mit ganzen Zahlen arbeiten, benötigtmin keinComparator:

@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 Stream-ObjektIntegermit der statischen MethodestreaminArrays erstellt haben. Für jeden primitiven Array-Typ gibt es äquivalentestream-Methoden.

Da das Array leer sein könnte, gibtminOptional, zurück. Um dies inint umzuwandeln, verwenden wirgetAsInt.

4. Finden des größten benutzerdefinierten Objekts

Erstellen wir ein einfaches POJO:

public class Car {
    private String model;
    private int topSpeed;

    // standard constructors, getters and setters
}

Und dann können wir dieStream-API erneut verwenden, um das schnellste Auto in einem Array vonCars 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 gibt die statische Methodestream vonArrays eine Instanz vonthe interface java.util.stream.Stream<T> where the method max requires a Comparator zurück.

Wir hätten unsere eigenen benutzerdefiniertenComparator erstellen können, aberComparator.comparing is much easier.

Beachten Sie erneut, dassmax aus demselben Grund wie zuvor eineOptional-Instanz zurückgibt.

Wir können entwederget diesen Wert verwenden oder mitOptionals alles Mögliche tun, wieorElseThrow, das eine Ausnahme auslöst, wennmax keinen Wert zurückgibt.

5. Fazit

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

Weitere Informationen zu dieser Bibliothek finden Sie inOracle documentation.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie inover on GitHub.