Рубрики
Без рубрики

Поиск Min/Max в массиве с помощью Java

Краткое введение о том, как найти минимальное/максимальное значение из заданного массива с помощью мощного API потока в Java 8.

Автор оригинала: baeldung.

1. введение

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

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

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.Интерфейс 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 с помощью статического метода stream в Массивы . Для каждого типа примитивного массива существуют эквивалентные методы stream .

Поскольку массив может быть пустым, 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);
}

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

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

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

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

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

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

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

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