Перейти к основному содержимому

Поиск минимума/максимума в массиве с помощью Java

· 3 мин. чтения

1. Введение

В этом кратком руководстве мы увидим, как найти максимальное и минимальное значения в массиве с помощью Stream API 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 может скрыть от нас эти детали . Но в тех случаях, когда API Java нас не устраивает, мы всегда можем вернуться к этому базовому алгоритму.

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

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

Интерфейс java.util.stream.IntStream предоставляет метод min , который прекрасно подойдет для наших целей.

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

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

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

assertEquals(7, min);
}

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

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

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

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

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

// standard constructors, getters and setters
}

И затем мы можем снова использовать Stream API, чтобы найти самую быструю машину в массиве Car s:

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

В этом случае поток статического метода Arrays возвращает экземпляр интерфейса java.util.stream.Stream<T> , где для метода max требуется Comparator .

Мы могли бы создать свой собственный Comparator , но Comparator.comparing гораздо проще.

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

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

5. Вывод

В этой короткой статье мы увидели, насколько просто и компактно можно найти максимум и минимум в массиве, используя Stream API Java 8.

Дополнительные сведения об этой библиотеке см. в документации Oracle .

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