Recherche de Min/Max dans un tableau avec Java

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'APIStream de Java 8.

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

2. Vue d'ensemble

Il existe de nombreuses façons de trouver la valeur minimale ou maximale 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 commentJava 8 can hide these details from us. Mais, dans les cas où l’API de Java ne nous convient pas, nous pouvons toujours revenir à cet algorithme de base.

Parce que nous devons vérifier chaque valeur du tableau, toutes les implémentations sontO(n).

3. Trouver la plus petite valeur

The java.util.stream.IntStream interface provides the min method qui fonctionnera très bien pour nos besoins.

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

@Test
public void whenArrayIsOfIntegerThenMinUsesIntegerComparator() {
    int[] integers = new int[] { 20, 98, 12, 7, 35 };

    int min = Arrays.stream(integers)
      .min()
      .getAsInt();

    assertEquals(7, min);
}

Remarquez comment nous avons créé l'objet de fluxInteger en utilisant la méthode statique destream dansArrays. Il existe des méthodesstreaméquivalentes pour chaque type de tableau primitif.

Puisque le tableau peut être vide,min renvoie unOptional, donc pour le convertir enint, nous utilisonsgetAsInt.

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'APIStream pour trouver la voiture la plus rapide dans un tableau deCars:

@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, la méthode statiquestream deArrays renvoie une instance dethe interface java.util.stream.Stream<T> where the method max requires a Comparator.

Nous pourrions avoir construit nos propresComparator personnalisés, maisComparator.comparing is much easier.

Notez à nouveau quemax renvoie une instanceOptional pour la même raison qu'auparavant.

Nous pouvons soitget cette valeur, soit faire tout ce qui est possible avecOptionals, commeorElseThrow qui lève une exception simax 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'APIStream de Java 8.

Pour plus d'informations sur cette bibliothèque, reportez-vous auxOracle documentation.

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