Пошук Min / Max в масиві за допомогою Java

1. Вступ

У цьому короткому підручнику ми побачимо, як знайти максимальне та мінімальне значення в масиві, використовуючи Java 8 Stream API.

Почнемо з пошуку мінімуму в масиві цілих чисел, а потім знайдемо максимум у масиві об’єктів.

2. Огляд

Існує багато способів знайти значення min або max у невпорядкованому масиві, і всі вони виглядають приблизно так:

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 за допомогою статичного методу stream в Arrays . Для кожного примітивного типу масиву існують еквівалентні методи потоку .

Оскільки масив може бути порожнім, min повертає необов’язковий, тому, щоб перетворити це на 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); }

В цьому випадку статичний методу потік з масивів повертає екземпляр інтерфейсу java.util.stream.Stream де метод макс вимагає компаратора .

Ми могли б створити власний власний компаратор , але порівняти компаратор набагато простіше.

Зверніть увагу ще раз, що max повертає необов’язковий екземпляр з тієї ж причини, що і раніше.

Ми можемо або отримати це значення, або ми можемо зробити все, що можливо, за допомогою необов’язкових s, наприклад orElseThrow, що видає виняток, якщо max не повертає значення.

5. Висновок

У цій короткій статті ми побачили, наскільки легко та компактно знаходити max та min в масиві, використовуючи Stream API Java 8.

Для отримання додаткової інформації про цю бібліотеку зверніться до документації Oracle.

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