Поиск значения max/min в массиве примитивов с помощью Java
это тривиально, чтобы написать функцию для определения минимального/максимального значения в массиве, например:
/**
*
* @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 < chars.length; ktr++) {
if (chars[ktr] > max) {
max = chars[ktr];
}
}
return max;
}
но разве это уже сделано где-то?
14 ответов:
использование Commons Lang (для преобразования) + коллекции (в мин / макс)
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 имеет минимальные и максимальные методы в своих Chars, Ints, Longs, etc. занятия.
Так что вы можете просто использовать:
Chars.min(myarray)никакие преобразования не требуются и, по-видимому, это эффективно реализовано.
вы можете просто использовать новый Java 8
Streams но вы должны работать сint.The
streamметод служебного классаArraysдаетIntStreamна котором вы можете использоватьminметод. Вы также можете сделатьmax,sum,average,...The
getAsIntметод используется для получения значение отOptionalIntimport 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); } }этот подход может дать лучшую производительность, чем классический цикл, потому что
summaryStatisticsметод операция по уменьшению и это позволяет распараллеливания.
Да, это делается в коллекции класса. Обратите внимание, что вам нужно будет преобразовать свой примитивный массив символов в символ[] вручную.
короткая демонстрация:
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); } }
У меня есть небольшой вспомогательный класс во всех моих приложениях с такими методами, как:
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)- чтобы получить поток с таким количеством элементов, как присутствует вintArray.
map(i -> intArray[i])- сопоставьте каждый элемент потока с фактическим элементомintArray.
max()- получить максимальный элемент этого потока, какOptionalInt.
getAsInt()- развернуOptionalInt. (Вы также можете использовать здесь: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<a.length; j++) { if (a[j] > max) { max = a[j]; } } } System.out.println("Max element: " + max); } }
передать массив в метод, который сортирует его с
Arrays.sort()поэтому он только сортирует массив, который использует метод, а затем устанавливает мин доarray[0]и Макс доarray[array.length-1].
вот служебный класс, предоставляющий
min/maxметоды для примитивных типов: примитивы.java
пример с float:
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> T getMax(T[] data) { T[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return copy[data.length - 1]; } public static <T> T getMin(T[] data) { T[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return copy[0]; }* * будьте в курсе возможных нулевых переданных аргументов :) (npx)
* * * для примитива замените T на желаемый тип или использовать массивы.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]; }
Comments