Trovare Min / Max in un array con Java

1. Introduzione

In questo breve tutorial, vedremo come trovare i valori massimo e minimo in un array, utilizzando l' API Stream di Java 8 .

Inizieremo trovando il minimo in un array di numeri interi, quindi troveremo il massimo in un array di oggetti.

2. Panoramica

Esistono molti modi per trovare il valore minimo o massimo in un array non ordinato e hanno tutti un aspetto simile a:

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

Vedremo come Java 8 può nasconderci questi dettagli . Ma, nei casi in cui l'API di Java non è adatta a noi, possiamo sempre tornare a questo algoritmo di base.

Poiché dobbiamo controllare ogni valore nell'array, tutte le implementazioni sono O (n) .

3. Trovare il valore più piccolo

L' interfaccia java.util.stream.IntStream fornisce il metodo min che funzionerà perfettamente per i nostri scopi.

Poiché stiamo lavorando solo con numeri interi, min non richiede un comparatore :

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

Si noti come abbiamo creato l' oggetto stream Integer utilizzando il metodo statico stream in Arrays . Esistono metodi di flusso equivalenti per ogni tipo di matrice primitiva.

Poiché l'array potrebbe essere vuoto, min restituisce un Optional, quindi per convertirlo in un int , usiamo getAsInt .

4. Trovare l'oggetto personalizzato più grande

Creiamo un semplice POJO:

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

Quindi possiamo utilizzare di nuovo l'API Stream per trovare l'auto più veloce in una serie di auto :

@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 questo caso, il flusso del metodo statico di Arrays restituisce un'istanza dell'interfaccia java.util.stream.Stream dove il metodo max richiede un Comparator .

Avremmo potuto costruire il nostro Comparatore personalizzato , ma confrontare Comparator.com è molto più semplice.

Nota ancora che max restituisce un'istanza facoltativa per lo stesso motivo di prima.

Possiamo ottenere questo valore o possiamo fare qualsiasi altra cosa possibile con Optional s, come oElseThrow che genera un'eccezione se max non restituisce un valore.

5. conclusione

Abbiamo visto in questo breve articolo quanto sia facile e compatto trovare max e min su un array, utilizzando l' API Stream di Java 8.

Per ulteriori informazioni su questa libreria, fare riferimento alla documentazione Oracle.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata su GitHub.