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

Nic*_*ner 169 java arrays algorithm frameworks

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

/**
 * 
 * @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;
}
Run Code Online (Sandbox Code Playgroud)

但这不是已经在某处做过的吗?

Mic*_*urd 164

使用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));
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,Arrays.asList()包装底层数组,因此它不应该太占用内存,也不应该对数组元素执行复制.

  • 什么是`ArrayUtils` (8认同)
  • `Arrays.asList(a)`不起作用.你不能创建一个原语列表(在这种情况下`List <char>`).首先,您需要将原始值转换为对象,这就是使用"ArrayUtils.toObject"的原因. (5认同)
  • `Arrays.asList()`应该没问题,但``ArrayUtils.toObject()`会将`a`的每个元素复制到一个新的`Character`数组. (3认同)

Ort*_*kni 77

你可以简单地使用新的Java 8 Stream小号,但你必须一起工作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)
    }

}
Run Code Online (Sandbox Code Playgroud)

== ==更新

如果执行时间很重要,并且只想一次使用这样的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法可以提供比经典循环更好的性能,因为该summaryStatistics方法是简化操作并且允许并行化.


And*_*lay 57

谷歌番石榴库拥有分钟,并在其字符数,类型int,long等类最大的方法.

所以你可以简单地使用:

Chars.min(myarray)
Run Code Online (Sandbox Code Playgroud)

不需要转换,并且可能是有效实施的.

  • 它在问题中或多或少地实现,除了它为长度为0的数组抛出IllegalArgumentException.(http://code.google.com/p/guava-libraries/source/browse/trunk/src/com/google/公共/图元/ Chars.java) (4认同)
  • 这是这里一切的最佳解决方案.避免所有java.util.Arrays#asList varargs混淆. (3认同)

Bar*_*ers 20

是的,它是在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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 将`char []`转换为`Character []`只是为了确定最大值是非常低效的 - 更好地为每个基本类型创建一个实用类,类似于`java.util.Arrays`:http:// java .sun.com/JavaSE的/ 6 /文档/ API/JAVA/UTIL/Arrays.html (2认同)

小智 15

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

  }

}
Run Code Online (Sandbox Code Playgroud)

  • @alex时间复杂度 - 排序最多是O(nlogn)事件,而Michael Rutherfurd方法是O(n). (8认同)
  • 请提供一些解释. (4认同)
  • 我想这意味着,如果你对数组进行排序(按升序排序),根据定义,最小值将始终位于第一个位置,a [0],最大值将始终位于最后位置,[a.length-1]. (3认同)
  • 我们不需要排序,因为单个迭代超过列表足以找到最小值和最大值. (3认同)

Sau*_*uer 11

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

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

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

    return max;
}
Run Code Online (Sandbox Code Playgroud)

  • ...或者您可以将 max 设置为数组中的第一项,然后从第二项开始迭代,请参阅我的答案。 (2认同)