使用 Java 在基元数组中查找最大值/最小值

2022-08-31 05:47:47

编写一个函数来确定数组中的最小值/最大值是微不足道的,例如:

/**
 * 
 * @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

使用共享资源朗(转换)+收藏夹(最小值/最大值)

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 Stream但您必须使用.int

实用工具类 Arrays方法为您提供了一个 IntStream,您可以在其上使用 min 方法。您还可以执行最大值总和平均值,...

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 方法是一种约简操作,它允许并行化。