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.