编写一个函数来确定数组中的最小/最大值是很简单的,例如:

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

但这不是已经在某个地方做过了吗?


当前回答

谷歌Guava库在其char, int, long等类中有min和max方法。

所以你可以简单地使用:

Chars.min(myarray)

不需要转换,并且可以有效地实现。

其他回答

获取数组的最小/最大值的基本方法。如果您需要无序数组,您可以创建一个副本或将其传递给返回最小值或最大值的方法。如果不是,排序数组更好,因为它在某些情况下执行得更快。

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

通过对数组排序,可以得到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);
  }
    
}

尽管排序操作比用简单的循环查找最小/最大值更昂贵。但当性能不是问题时(例如,小数组,或者成本与应用程序无关),这是一个相当简单的解决方案。

注意:数组在此之后也会被修改。

你可以使用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为空。)

你可以简单地使用新的Java 8 Streams,但你必须使用int。

实用工具类Arrays的stream方法为您提供了一个IntStream,您可以在该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方法是一个约简操作,并且它允许并行化。

使用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()包装底层数组,因此它不应该占用太多内存,也不应该对数组的元素执行复制。