/**
*
* @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 楼
使用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
–nessa.gp
17年2月16日在5:19
#2 楼
您可以简单地使用新的Java 8Stream
,但是必须使用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)
}
}
== 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 楼
您可以使用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
为空。)#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
评论
从原始数组到容器数组的排列将有所帮助:stackoverflow.com/questions/3770289/…,然后是Collections.max(Arrays.asList())。我只是喜欢Java太笨了