Поиск значения max / min в массиве примитивов с использованием Java
Тривиально написать функцию для определения значения min / max в массиве, например:
/** * * @param chars * @return the max value in the array of chars */ private static int maxValue(char[] chars) { int max = chars[0]; for (int ktr = 0; ktr max) { max = chars[ktr]; } } return max; }
но разве это уже не сделано?
- Как отсортировать массив в Bash
- Java Удалить дубликаты из массива?
- ArrayList: как размер увеличивается?
- Преобразование 'ArrayList в' String 'в Java
- Быстрый способ преобразования двумерного массива в список (одномерный)
- Как преобразовать строку в список в Python?
- Как инициализировать массив в Java?
- Работа со списком списков в Java
- Выделить память 2d массива в функции C
- Печатать массив без скобок и запятых
- Как суммировать все значения столбцов в многомерном массиве?
- Java: как преобразовать HashMap в массив
- Почему массивы инвариантны, но списки ковариантны?
Использование Commons Lang (для преобразования) + Коллекции (до min / max)
import java.util.Arrays; import java.util.Collections; import org.apache.commons.lang.ArrayUtils; public class MinMaxValue { public static void main(String[] args) { char[] a = {'3', '5', '1', '4', '2'}; List b = Arrays.asList(ArrayUtils.toObject(a)); System.out.println(Collections.min(b)); System.out.println(Collections.max(b)); } }
Обратите внимание, что Arrays.asList()
обертывает базовый массив, поэтому он не должен быть слишком интенсивным для памяти и не должен выполнять копию элементов массива.
Библиотека Google Guava имеет минимальные и максимальные методы в classах Chars, Ints, Longs и т. Д.
Поэтому вы можете просто использовать:
Chars.min(myarray)
Конверсии не требуются и, по-видимому, они эффективно реализованы.
Вы можете просто использовать новый Java 8 Stream
но вам нужно работать с int
.
Метод stream
из IntStream
classов утилит дает вам IntStream
в котором вы можете использовать метод min
. Вы также можете делать max
, sum
, average
, …
Метод getAsInt
используется для получения значения из параметра OptionalInt
import java.util.Arrays; public class Test { public static void main(String[] args){ int[] tab = {12, 1, 21, 8}; int min = Arrays.stream(tab).min().getAsInt(); int max = Arrays.stream(tab).max().getAsInt(); System.out.println("Min = " + min); System.out.println("Max = " + max) } }
== UPDATE ==
Если время выполнения важно и вы хотите просмотреть данные только после того, как вы можете использовать метод summaryStatistics()
подобный этому
import java.util.Arrays; import java.util.IntSummaryStatistics; public class SOTest { public static void main(String[] args){ int[] tab = {12, 1, 21, 8}; IntSummaryStatistics stat = Arrays.stream(tab).summaryStatistics(); int min = stat.getMin(); int max = stat.getMax(); System.out.println("Min = " + min); System.out.println("Max = " + max); } }
Этот подход может дать лучшую производительность, чем classический цикл, потому что метод summaryStatistics
является операцией сокращения и позволяет распараллеливать.
Да, это сделано в classе Collections . Обратите внимание, что вам нужно будет преобразовать ваш примитивный массив символов в символ [] вручную.
Короткая демонстрация:
import java.util.*; public class Main { public static Character[] convert(char[] chars) { Character[] copy = new Character[chars.length]; for(int i = 0; i < copy.length; i++) { copy[i] = Character.valueOf(chars[i]); } return copy; } public static void main(String[] args) { char[] a = {'3', '5', '1', '4', '2'}; Character[] b = convert(a); System.out.println(Collections.max(Arrays.asList(b))); } }
import java.util.Arrays; public class apples { public static void main(String[] args) { int a[] = {2,5,3,7,8}; Arrays.sort(a); int min =a[0]; System.out.println(min); int max= a[a.length-1]; System.out.println(max); } }
У меня есть небольшой вспомогательный class во всех моих приложениях с такими методами, как:
public static double arrayMax(double[] arr) { double max = Double.NEGATIVE_INFINITY; for(double cur: arr) max = Math.max(max, cur); return max; }
Вы можете легко сделать это с помощью IntStream
и max()
.
пример
public static int maxValue(final int[] intArray) { return IntStream.range(0, intArray.length).map(i -> intArray[i]).max().getAsInt(); }
объяснение
-
range(0, intArray.length)
Чтобы получить stream с таким количеством элементов, как вintArray
. -
map(i -> intArray[i])
–map(i -> intArray[i])
каждый элемент streamа с фактическим элементомintArray
. -
max()
– Получить максимальный элемент этого streamа какOptionalInt
. -
getAsInt()
–getAsInt()
. (Вы также можете использовать здесь:orElse(0)
, на всякий случай, еслиOptionalInt
пуст.)
import java.util.Random; public class Main { public static void main(String[] args) { int a[] = new int [100]; Random rnd = new Random (); for (int i = 0; i< a.length; i++) { a[i] = rnd.nextInt(99-0)+0; System.out.println(a[i]); } int max = 0; for (int i = 0; i < a.length; i++) { a[i] = max; for (int j = i+1; j max) { max = a[j]; } } } System.out.println("Max element: " + max); } }
Передайте массив методу, который сортирует его с помощью Arrays.sort()
поэтому он сортирует только массив, который использует этот метод, затем устанавливает min в array[0]
и max в array[array.length-1]
.
Вот class утилиты, предоставляющий методы min/max
для примитивных типов: Primitives.java
Пример с поплавком:
public static float getMaxFloat(float[] data) { float[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return copy[data.length - 1]; } public static float getMinFloat(float[] data) { float[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return copy[0]; }
Основной способ получить минимальное / максимальное значение массива. Если вам нужен несортированный массив, вы можете создать копию или передать ее методу, который возвращает min или max. Если нет, отсортированный массив лучше, поскольку в некоторых случаях он работает быстрее.
public class MinMaxValueOfArray { public static void main(String[] args) { int[] A = {2, 4, 3, 5, 5}; Arrays.sort(A); int min = A[0]; int max = A[A.length -1]; System.out.println("Min Value = " + min); System.out.println("Max Value = " + max); } }
public int getMin(int[] values){ int ret = values[0]; for(int i = 1; i < values.length; i++) ret = Math.min(ret,values[i]); return ret; }
общее решение *:
public static T getMax(T[] data) { T[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return copy[data.length - 1]; } public static T getMin(T[] data) { T[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return copy[0]; }
** быть в курсе возможных пустых переданных аргументов 🙂 (npx)
* ** для примитива заменить T желаемым типом или использовать Arrays.asList ()
пример:
public static long getMinMax(long[] data, boolean max) { // do checj if length > 0 or not null throw ex illegal state exception long[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return max ? copy[data.length - 1] : copy[0]; }