Вопрос-ответ

Finding the max/min value in an array of primitives using Java

Нахождение максимального / минимального значения в массиве примитивов с помощью 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;
}

но разве это где-то уже не сделано?

Переведено автоматически
Ответ 1

Использование Commons Lang (для преобразования) + Collections (для преобразования в 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() оборачивает базовый массив, поэтому он не должен занимать слишком много памяти и не должен выполнять копирование элементов массива.

Ответ 2

Вы можете просто использовать новую Java 8 Streams, но вам придется поработать с int.

stream Метод служебного класса Arrays предоставляет вам, 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)
}

}

== ОБНОВЛЕНИЕ ==

Если важно время выполнения и вы хотите просмотреть данные только один раз, вы можете использовать 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 метод представляет собой операцию сокращения и допускает распараллеливание.

Ответ 3

В библиотеке Google Guava есть методы min и max для символов, целых чисел, длин и т.д. классы.

Таким образом, вы можете просто использовать:

Chars.min(myarray)

Никаких преобразований не требуется, и, предположительно, это эффективно реализовано.

Ответ 4

Сортируя массив, вы получаете первое и последнее значения для min / max.

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);
}

}

Хотя операция сортировки обходится дороже, чем простой поиск минимальных / максимальных значений с помощью простого цикла. Но когда производительность не вызывает беспокойства (например, небольшие массивы или стоимость не имеет значения для вашего приложения), это довольно простое решение.

Примечание: после этого массив также будет изменен.

java arrays algorithm