Поиск минимума/максимума в массиве с помощью Java
В этом кратком руководстве мы увидим, как найти максимальное и минимальное значения в массиве с помощью 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 , где для метода max требуется Comparator .
Мы могли бы создать свой собственный Comparator , но Comparator.comparing гораздо проще.
Обратите внимание еще раз, что max возвращает необязательный экземпляр по той же причине, что и раньше.
Мы можем либо получить это значение, либо сделать что-то еще с необязательными s, например, orElseThrow , который выдает исключение, если max не возвращает значение.
5. Вывод
В этой короткой статье мы увидели, насколько просто и компактно можно найти максимум и минимум в массиве, используя Stream API Java 8.
Дополнительные сведения об этой библиотеке см. в документации Oracle .
Реализацию всех этих примеров и фрагментов кода можно найти на GitHub .
Как найти минимальное число в java
Можно воспользоваться методом stream() из класса Arrays . С помощью стрима пройтись по всем элементам и найти наименьший элемент. Метод min() как раз подходит. Если вдруг стрим окажется пустым, то будет выброшено исключение NoSuchElementException .
import java.util.Arrays; public class Example public static void main(String[] args) int[] arr = 10, 7, 1, 4, 7, 4, 11>; int min = Arrays.stream(arr) .min() .orElseThrow(); System.out.println(min); // => 1 > >
Почему не получается найти минимальное ненулевое число в массиве?
Нужно найти в массиве минимальное ненулевое число. В if я прописываю что число !=0, но в результате всё равно выводит 0. В чем проблема?
public class Main < public static void main(String[] args) < int[][] arr = new int[][]< , , , , >; int Min = arr[0][0]; for (int i = 0; i < 5; i++)< for (int j = 0; j < 5; j++) < if ((arr[i][j] != 0) && (arr[i][j] < Min) ) Min = arr[i][j]; >> System.out.println(Min); > >
- Вопрос задан более двух лет назад
- 110 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 2

Для правильного вопроса надо знать половину ответа
int Min = arr[0][0];
У вас arr[0][0] == 0, соответственно это и есть минимальное значение.
Используйте Integer.MAX_VALUE
Ответ написан более двух лет назад

Не красивое как по мне решение

Артём, Вообще-то оно стандартное. Для поиска минимума используют инициализацию MAX_VALUE, для поиска максимума MIN_VALUE.

Просто поставь проверку для присвоения Min(вообще такие переменные с маленькой буквы пишутся)
Например:
int min; int nextI, nextJ for (int i = 0; i < 5; i++)< for (int j = 0; j < 5; j++) < if (arr[i][j] != 0) min = arr[i][j]; nextI = i; nextJ = j; >> if (nextI == 4) < nextI = 0; nextJ++; >else < nextI++; >for (int i = nextI; i < 5; i++)< for (int j = nextJ; j < 5; j++) < if (arr[i][j] != 0 && arr[i][j] < min) min = arr[i][j]; >>
Можно инкапсулировать все в два метода
Ответ написан более двух лет назад

Решение неверное.
Если первый цикл остановился например, на i == 2, j == 2, то дальше вложенный цикл всегда будет начинаться от nextJ == 2 и, таким образом, часть значений не будет просмотрена.
P.S. Не обратил внимания сразу. После первого цикла будет найдено последнее ненулевое значение, соответственно второй цикл вообще не имеет смысла.

Надо просто if переписать, а то я перепутал:
if (nextJ == 4) < nextJ = 0; nextI++; >else
Второй цикл необходим, чтобы найти минимальное значение. В вопросе написано. Нам не нужно первое не нулевое

Артём, Второй цикл бессмысленный, потому что после первого у вас всегда nextI == 4 и nextJ == 4. Так что, с этим условием вы получите nextI == 5, соответственно второй цикл ни разу выполнен не будет.

Rsa97, в первом «двойном» цикле break забыл поставить в конце

Артём, В результате вы получаете тот же самый результат, что и при использовании Integer.MAX_VALUE, но гораздо сложнее и с большей вероятностью ошибиться. Например, если в массиве только нули, то у вас не инициализируется min и результат непредсказуем.
А если вам так не нравятся стандартные константы, то проще написать так:
int min; min = 0; for (int i = 0; i < 5; i += 1) < for (int j = 0; j < 5; j += 1) < if (arr[i][j] != 0 && (min == 0 || arr[i][j] < min)) < min = arr[i][j]; >> >
Как найти минимальное число в массиве java
В Java 8 и выше можно использовать потоки streams для нахождения минимального числа в массиве. Для этого можно использовать метод min() класса java.util.stream.IntStream , который возвращает минимальное значение в потоке.
int[] numbers = 10, 20, 30, 40, 50>; int min = Arrays.stream(numbers).min().getAsInt(); System.out.println("Минимальное число: " + min);
Здесь мы создаем поток из массива numbers с помощью метода Arrays.stream() , а затем вызываем метод min() для нахождения минимального значения. Метод min() вернет объект OptionalInt , поэтому мы вызываем метод getAsInt() для получения примитивного значения int
05 апреля 2023
Для нахождения минимального числа в массиве можно использовать цикл, проходящий по всем элементам массива и сохраняя минимальное значение в отдельную переменную. Вот пример кода:
public static int findMin(int[] arr) int min = arr[0]; for (int i = 1; i arr.length; i++) if (arr[i] min) min = arr[i]; > > return min; >
В данном примере функция findMin принимает в качестве аргумента массив целых чисел arr и возвращает минимальное число в массиве.
- Переменная min инициализируется значением первого элемента массива arr[0] .
- Затем происходит цикл по всем элементам массива, начиная со второго элемента arr[1] .
- Если текущий элемент меньше переменной min , ей присваивается значение текущего элемента.
- По завершении цикла возвращается значение переменной min .