Localizando Min/Max em uma matriz com Java

Localizando Min / Max em uma matriz com Java

1. Introdução

Neste breve tutorial, veremos como encontrar os valores máximo e mínimo em uma matriz, usando a APIStream do Java 8.

Começaremos encontrando o mínimo em uma matriz de inteiros e, em seguida, encontraremos o máximo em uma matriz de objetos.

2. Visão geral

Existem várias maneiras de encontrar o valor mínimo ou máximo em uma matriz não ordenada e todas elas se parecem com:

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

Vamos ver comoJava 8 can hide these details from us. Mas, nos casos em que a API do Java não nos convém, podemos sempre voltar a este algoritmo básico.

Como precisamos verificar cada valor no array, todas as implementações sãoO(n).

3. Encontrando o Menor Valor

The java.util.stream.IntStream interface provides the min method que funcionará bem para nossos propósitos.

Como estamos trabalhando apenas com inteiros,min não requer umComparator:

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

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

    assertEquals(7, min);
}

Observe como criamos o objeto de fluxoInteger usando o método estáticostream emArrays. Existem métodosstream equivalentes para cada tipo de array primitivo.

Como o array pode estar vazio,min retorna umOptional,, então para converter isso em umint, usamosgetAsInt.

4. Encontrando o maior objeto personalizado

Vamos criar um POJO simples:

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

    // standard constructors, getters and setters
}

E então podemos usar a APIStream novamente para encontrar o carro mais rápido em uma matriz 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);
}

Nesse caso, o método estáticostream deArrays retorna uma instância dethe interface java.util.stream.Stream<T> where the method max requires a Comparator.

Poderíamos ter construído nosso próprioComparator personalizado, masComparator.comparing is much easier.

Observe novamente quemax retorna uma instânciaOptional pelo mesmo motivo de antes.

Podemosget este valor ou podemos fazer tudo o que for possível comOptionals, comoorElseThrow que lança uma exceção semax não retornar um valor.

5. Conclusão

Vimos neste breve artigo como é fácil e compacto encontrar max e min em um array, usando a APIStream do Java 8.

Para obter mais informações sobre esta biblioteca, consulteOracle documentation.

A implementação de todos esses exemplos e trechos de código pode ser encontradaover on GitHub.