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

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


但这还不是在某个地方完成的吗?

评论

从原始数组到容器数组的排列将有所帮助:stackoverflow.com/questions/3770289/…,然后是Collections.max(Arrays.asList())。

我只是喜欢Java太笨了

#1 楼

使用Commons Lang(转换)+ Collections(最小/最大)

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()包装了基础数组,因此它不应占用太多内存,并且不应在数组的元素上执行复制。

评论


什么是ArrayUtils

–巴希尔·阿尔·莫曼尼(Basheer AL-MOMANI)
16年5月18日在18:39

Arrays.asList()应该可以,但是ArrayUtils.toObject()会将a的每个元素复制到一个新的Character数组中。

– E.M.
16-10-22在18:08

Arrays.asList(a)不起作用。您无法创建基元列表(在这种情况下为List )。首先,您需要将原始值转换为对象,这就是使用ArrayUtils.toObject的原因。

–nessa.gp
17年2月16日在5:19

#2 楼

您可以简单地使用新的Java 8 Stream,但是必须使用int

实用程序类streamArrays方法为您提供了IntStream,可以在其中使用min方法。您也可以执行maxsumaverage,...

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


因为summaryStatistics方法是一种归约运算,并且允许并行化,所以该方法比经典循环可提供更好的性能。

#3 楼

Google Guava库在其Chars,Ints,Longs等类中具有min和max方法。

因此,您可以简单地使用:

Chars.min(myarray)


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

评论


它的实现方式与问题基本相同,只是它为长度为0的数组抛出IllegalArgumentException。(code.google.com/p/guava-libraries/source/browse/trunk/src/com / ...)

– ColinD
09年12月10日在20:45

这是这里一切的最佳解决方案。避免所有java.util.Arrays#asList varargs混淆。

–香港
2014年5月25日23:02



#4 楼

是的,这是在Collections类中完成的。请注意,您将需要手动将原始char数组转换为Character []。

简短的演示:

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


评论


Collections.min(myCollection);如果要将其用于数组,则可以像Collections.min(Arrays.asList(myArray));一样进行操作。

–Zed
09年9月27日在20:33

仅将char []转换为Character []以确定最大值是非常低效的-更好地为每个类似于java.util.Arrays的原始类型创建带有静态方法的实用工具类:java.sun.com/javase/6/docs /api/java/util/Arrays.html

– Christophh
09年9月27日在20:33

@Christoph:是的,如果数组的大小很大,我会同意。如果所讨论的应用程序进行了许多数据库调用和/或I / O操作,并且数组的大小很小(相对),则简单地指出它“低效”是没有意义的。

–巴特基尔斯
09年9月27日在20:41

出于性能原因,您应该使用Character.valueOf(chars [i])而不是新的Character(chars [i]):java.sun.com/javase/6/docs/api/java/lang/…

– Christophh
09年9月27日在20:45

@Christoph Christoph是正确的,将数组转换为Collection进行最小最大搜索效率低下且愚蠢。

– AlexWien
13年4月3日在22:04

#5 楼

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

  }

}


评论


请提供一些解释。

–麦克·斯托克代尔(Mike Stockdale)
14年4月19日在14:47

我认为这意味着如果按照定义对数组进行升序排列(升序),最小值将始终位于第一个位置,a [0],最大值将始终位于最后一个位置,[a.length-1]。

–杰夫
2014年8月27日在21:20

这是解决问题的合法且有用的方法。与其他相比,使用它的缺点是什么?

– Alex
2014年11月3日19:34

@alex时间复杂度-排序最多是O(nlogn)事务,而Michael Rutherfurd方法是O(n)。

– Jajdoo
2015年1月10日13:34

我们不需要排序,因为列表上的单个迭代足以找到最小值和最大值。

–akhil_mittal
2015年2月23日下午5:59

#6 楼

我的所有应用程序中都有一个辅助类,其方法如下:

public static double arrayMax(double[] arr) {
    double max = Double.NEGATIVE_INFINITY;

    for(double cur: arr)
        max = Math.max(max, cur);

    return max;
}


评论


您应该使用double max = Double.NEGATIVE_INFINITY;而不是double max = Double.MIN_VALUE;由于MIN_VALUE代表正数

– krems
17年6月15日在18:56

...或者您可以将max设置为数组中的第一项,然后从第二项进行迭代,请参阅我的答案。

–尼古拉斯·汉密尔顿
18 Mar 6 '18 at 10:47

#7 楼

您可以使用IntStreammax()方法轻松完成此操作。

示例

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为空。)


#8 楼

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


评论


这是用于数字int的,但问题是要求输入原始值int,long,char,byte...。

– IgniteCoders
18年3月6日在13:18

#9 楼

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


#10 楼

使用reduce()的解决方案:

int[] array = {23, 3, 56, 97, 42};
// directly print out
Arrays.stream(array).reduce((x, y) -> x > y ? x : y).ifPresent(System.out::println);

// get the result as an int
int res = Arrays.stream(array).reduce((x, y) -> x > y ? x : y).getAsInt();
System.out.println(res);
>>
97
97


在上面的代码中,reduce()返回Optional格式的数据,您可以通过int将其转换为getAsInt()

如果要将最大值与某个数字进行比较,可以在reduce()中设置一个起始值:

int[] array = {23, 3, 56, 97, 42};
// e.g., compare with 100
int max = Arrays.stream(array).reduce(100, (x, y) -> x > y ? x : y);
System.out.println(max);
>>
100


在代码中如上所示,当以身份(起始值)作为第一个参数的reduce()时,它以与身份相同的格式返回数据。使用此属性,我们可以将此解决方案应用于其他阵列:

double[] array = {23.1, 3, 56.6, 97, 42};
double max = Arrays.stream(array).reduce(array[0], (x, y) -> x > y ? x : y);
System.out.println(max);
>>
97.0


#11 楼

这是一个实用程序类,提供用于基本类型的min/max方法:Primitives.java
int [] numbers= {10,1,8,7,6,5,2};
    int a=Integer.MAX_VALUE;
    for(int c:numbers) {
        a=c<a?c:a;
        }
        
    System.out.println("Lowest value is"+a);


#12 楼

带有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];
}


评论


虽然您的解决方案可以使用,但会增加时间复杂度至O(nlogn),而使用其他答案可以在O(n)中轻松找到min。

– Pramod
'18 Sep 8'在10:19

在这种情况下使用某种排序方式简直太疯狂了。

–尼古拉斯·汉密尔顿
19 Mar 10 '19在8:45

当需要前n个大于或等于1的最大值并进行某些维修时,此功能将非常有用。

–biziclop
19 Mar 30 '19在9:20

#13 楼

以下是在大约99%的运行次数中获得最大值的解决方案(更改0.01以获得更好的结果):

public static double getMax(double[] vals){
    final double[] max = {Double.NEGATIVE_INFINITY};

    IntStream.of(new Random().ints((int) Math.ceil(Math.log(0.01) / Math.log(1.0 - (1.0/vals.length))),0,vals.length).toArray())
            .forEach(r -> max[0] = (max[0] < vals[r])? vals[r]: max[0]);

    return max[0];
}


(不完全严重)

评论


;-)那是“不完全认真”。犹豫要投票…

– Ole V.V.
18/12/8在2:38

#14 楼

将数组传递给使用Arrays.sort()对其进行排序的方法,以便仅对使用该方法的数组进行排序,然后将min设置为array[0],将max设置为array[array.length-1]

评论


可能值得注意的是,a)会修改数组,b)对于大型数组,这是更昂贵的解决方案O(nlog n)而不是O(n)

– davidsheldon
16年8月30日在10:14



#15 楼

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

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


评论


排序的问题在于,对于O(n)问题,它具有O(n log n)的开销。但这比已经给出的其他三个“排序数组”答案更好。

–帐篷
15年6月19日在12:13