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

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

771614 次浏览

是的,它在集合类中完成。注意,您需要手动将原始字符数组转换为字符[]。

一个简短的演示:

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

下面是一个为基本类型提供min/max方法的实用程序类

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

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

谷歌番石榴图书馆在其char、int、long等类中有min和max方法。

所以你可以简单地使用:

Chars.min(myarray)

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

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

将数组传递给一个使用Arrays.sort()对数组进行排序的方法,这样它只对方法使用的数组进行排序,然后将最小值设置为array[0],将马克斯设置为array[array.length-1]

通过对数组排序,可以得到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 8 Streams,但你必须使用int

实用工具类Arraysstream方法给你一个IntStream,你可以在上面使用Arrays0方法。你也可以做Arrays1, Arrays2, Arrays3,…

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方法是减少操作,并且它允许并行化。

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

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

你可以用IntStreammax()方法轻松地做到这一点。

例子

public static int maxValue(final int[] intArray) {
return IntStream.range(0, intArray.length).map(i -> intArray[i]).max().getAsInt();
}

解释

  1. range(0, intArray.length) -获取与intArray中相同数量元素的流。

  2. map(i -> intArray[i]) -将流的每个元素映射到intArray的一个实际元素。

  3. max() -获取此流的最大元素OptionalInt

  4. getAsInt() -打开OptionalInt。(你也可以在这里使用:orElse(0),以防OptionalInt为空。)

使用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];
}

我有一个小助手类在我所有的应用程序与方法:

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


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


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

下面是在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];
}

(不完全严重)

使用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格式的数据,可以通过getAsInt()将其转换为int

如果我们想将最大值与某个数字进行比较,可以在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
    int[] arr = {1, 2, 3};


List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
int max_ = Collections.max(list);
int i;
if (max_ > 0) {
for (i = 1; i < Collections.max(list); i++) {
if (!list.contains(i)) {
System.out.println(i);
break;
}
}
if(i==max_){
System.out.println(i+1);
}
} else {
System.out.println("1");
}
}