Поиск Мин/Макс в массиве с Java

Нахождение мин / макс в массиве с Java

1. Вступление

В этом коротком руководстве мы увидим, как найти максимальное и минимальное значения в массиве с помощью APIStream Java 8.

Мы начнем с поиска минимума в массиве целых чисел, а затем найдем максимум в массиве объектов.

2. обзор

Есть много способов найти минимальное или максимальное значение в неупорядоченном массиве, и все они выглядят примерно так:

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

Мы собираемся посмотреть, какJava 8 can hide these details from us. Но в случаях, когда API Java нам не подходит, мы всегда можем вернуться к этому базовому алгоритму.

Поскольку нам нужно проверить каждое значение в массиве, все реализации -O(n).

3. Поиск наименьшего значения

The java.util.stream.IntStream interface provides the min method, который отлично подойдет для наших целей.

Поскольку мы работаем только с целыми числами,min не требуетComparator:

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

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

    assertEquals(7, min);
}

Обратите внимание, как мы создали объект потокаInteger, используя статический методstream вArrays. Существуют эквивалентные методыstream для каждого типа примитивного массива.

Поскольку массив может быть пустым,min возвращаетOptional,, поэтому для преобразования его вint мы используемgetAsInt.

4. Поиск самого большого настраиваемого объекта

Давайте создадим простой POJO:

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

    // standard constructors, getters and setters
}

А затем мы можем снова использовать APIStream, чтобы найти самую быструю машину в массивеCars:

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

В этом случае статический методstream дляArrays возвращает экземплярthe interface java.util.stream.Stream<T> where the method max requires a Comparator.

Мы могли бы создать свой собственныйComparator, ноComparator.comparing is much easier.

Еще раз обратите внимание, чтоmax возвращает экземплярOptional по той же причине, что и раньше.

Мы можем либоget это значение, либо мы можем сделать все, что возможно, сOptionals, напримерorElseThrow, который вызывает исключение, еслиmax не возвращает значение.

5. Заключение

В этой короткой статье мы увидели, насколько легко и компактно найти max и min в массиве с помощью APIStream Java 8.

Для получения дополнительной информации об этой библиотеке обратитесь кOracle documentation.

Реализацию всех этих примеров и фрагментов кода можно найти вover on GitHub.