Recherche de Min / Max dans un tableau avec Java

1. Introduction

Dans ce court didacticiel, nous allons voir comment trouver les valeurs maximale et minimale dans un tableau, à l'aide de l' API Stream de Java 8 .

Nous commencerons par trouver le minimum dans un tableau d'entiers, puis nous trouverons le maximum dans un tableau d'objets.

2. Aperçu

Il existe de nombreuses façons de trouver la valeur min ou max dans un tableau non ordonné, et elles ressemblent toutes à quelque chose comme:

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

Nous allons voir comment Java 8 peut nous cacher ces détails . Mais, dans les cas où l'API de Java ne nous convient pas, nous pouvons toujours revenir à cet algorithme de base.

Comme nous devons vérifier chaque valeur du tableau, toutes les implémentations sont O (n) .

3. Recherche de la plus petite valeur

L' interface java.util.stream.IntStream fournit la méthode min qui fonctionnera parfaitement pour nos besoins.

Comme nous ne travaillons qu'avec des entiers, min ne nécessite pas de comparateur :

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

Notez comment nous avons créé l' objet de flux Integer à l'aide de la méthode statique de flux dans Arrays . Il existe des méthodes de flux équivalentes pour chaque type de tableau primitif.

Étant donné que le tableau pourrait être vide, min renvoie une option, pour ainsi convertir en un int , nous utilisons getAsInt .

4. Recherche du plus grand objet personnalisé

Créons un simple POJO:

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

Et puis nous pouvons à nouveau utiliser l' API Stream pour trouver la voiture la plus rapide parmi une gamme de voitures :

@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); }

Dans ce cas, le flux de méthode statique de Arrays renvoie une instance de l'interface java.util.stream.Stream où la méthode max nécessite un comparateur .

Nous aurions pu construire notre propre comparateur personnalisé , mais Comparator.comparing est beaucoup plus facile.

Notez à nouveau que max renvoie une instance facultative pour la même raison qu'auparavant.

Nous pouvons soit obtenir cette valeur, soit faire tout ce qui est possible avec des options optionnelles , comme orElseThrow qui lève une exception si max ne renvoie pas de valeur.

5. Conclusion

Nous avons vu dans ce court article à quel point il est facile et compact de trouver max et min sur un tableau, en utilisant l' API Stream de Java 8.

Pour plus d'informations sur cette bibliothèque, veuillez consulter la documentation Oracle.

L'implémentation de tous ces exemples et extraits de code peut être trouvée sur GitHub.