我想要数组中最高的偶数。
public static void main(String[] args) {
int[] a = new int[]{10, 46, 78, 32, 3, 80, 92, 11, 39, 57};
System.out.println(Arrays.toString(a));
int largest = Integer.MAX_VALUE;
for(int number : a) {
if(number > largest) {
largest = number;
}
}
System.out.println(largest);
}
输出结果为:
[10, 46, 78, 32, 3, 80, 92, 11, 39, 57]
2147483647
答案 0 :(得分:2)
不要将largest
初始化为max int:
int largest = Integer.MAX_VALUE;
将其设置为min int而不是
int largest = Integer.MIN_VALUE;
或者,正如@Stultuske建议的那样,初始化为数组中的第一个值:
int largest = a[0];
正如@Zabusa指出的那样,你想要偶数。因此,改进if语句,使其仅在偶数上触发:
if (number > largest && number % 2 == 0) {
答案 1 :(得分:2)
您的代码有两个问题。第一个是,正如其他人已经指出的那样,你从Integer.MAX_VALUE
作为初始猜测开始,这是错误的逻辑。
您需要使用最差的最大值作为初始猜测。否则你的元素将总是更小,因此你的初始猜测是最大的元素。这就是我们开始猜测MIN_VALUE
为最大元素的原因。因为数组的元素只能变大。只需在纸上播放算法,就像{1, 2}
这样的小例子,你就会明白为什么这是有意义的。
第二个问题是您实际上正在考虑所有值,但您只想考虑偶数值。我们可以通过跳过所有奇数值轻松解决这个问题。
以下是两个修复程序的代码:
public static void main(String[] args) {
int[] a = new int[]{10, 46, 78, 32, 3, 80, 92, 11, 39, 57};
System.out.println(Arrays.toString(a));
// Start with lowest value as initial guess
int largest = Integer.MIN_VALUE;
for (int number : a) {
// Skip number if odd
if (number % 2 == 1) {
continue;
}
// Now we only consider and collect even numbers
if (number > largest) {
// Update the current guess
largest = number;
}
}
// We now considered all elements, the guess is
// final and correct.
// And also even since we skipped odd values.
System.out.println(largest);
}
如果数组不包含任何偶数,则输出将为Integer.MIN_VALUE
,您可以考虑这种特殊情况并使用一些if
子句捕获它。
其他人建议使用数组元素作为初始猜测。由于您只需要偶数值,因此您可能只考虑使用数组的偶数值进行初始猜测。否则,如果数组不包含偶数值,则会再次输出奇数。
您可以使用通用且紧凑的Stream
解决方案作为自定义方法的替代方法:
int maxEven = Arrays.stream(a)
.filter(a -> a % 2 == 0) // Only even values
.max() // OptionalInt
.orElse(-1); // Gets the value or uses -1 if not present
答案 2 :(得分:1)
使用Streams的另一种简单解决方案:
int[] a = new int[] { 10, 46, 78, 32, 3, 80, 92, 11, 39, 57 };
System.out.println(Arrays.toString(a));
int largest = Arrays.stream(a).filter((i) -> i % 2 == 0).max().getAsInt();
System.out.println(largest);
高效快捷的方法。如果列表中没有偶数,getAsInt()
将抛出一个NoSuchElementException
,可以轻松地以您喜欢的方式捕获和处理。
如果您不想使用异常但希望有一个定义的值表示您的输入可能格式错误,那么您也可以使用getAsInt()
或类似代替orElse(-1)
。
答案 3 :(得分:1)
如果您可以访问Java 8及更高版本,我绝对可以查看Streams API。您可以将整数数组视为值流。使用该流,您可以访问高级功能,如min,max和filter。在Java中使用Streams有许多优点,例如下面提到的。
Java 8 Streams可以看作是懒惰构造的集合,其中值是在用户需要时计算的。实际集合的行为与它完全相反,它们是热切计算的值集(无论用户是否需要特定值)。
您可以继续阅读here
那么,要回答关于如何在阵列中检索最高价值的初步问题,请按以下步骤操作:
//仅计算最大值
的片段int maxValue = Arrays.stream(arrayOfVals)
.mapToInt(v -> v)
.filter(val -> val%2 == 0)
.max()
.orElse(-1);
答案 4 :(得分:0)
适用于正面和负面偶数
int[] a = new int[]{100, 45, 77, 33, 3, 81, 80, 8, 120, 100,-2};
int maxvalue = Integer.MIN_VALUE;
for (int anA : a) {
if (anA % 2 == 0) {
if (anA >= maxvalue)
maxvalue = anA;
}
}
答案 5 :(得分:0)
尝试以下代码:
public static void main (String [] args)
{
int [] arr = {31,-2,3,-4,9,3,8,11,7};
int maxEven, firstEven = 1;
for (int i = 0; i < arr.length; i++)
if(arr [i]%2 == 0)
{
firstEven = arr [i];
break;
}
maxEven = firstEven;
for (int j = 0; j < arr.length; j++)
if (arr [j]%2 == 0 && arr [j]>maxEven)
maxEven = arr [j];
if (maxEven == 1)
System.out.println ("No even numbers in this array!");
else
System.out.println ("The maximum even number is: "+maxEven);
}
答案 6 :(得分:-3)
最简单的方法(如果你确实使用这样的小数组)有: 步骤1.对数组进行排序 第2步。打印最后一个元素。
对于大型阵列,Stefan提供的解决方案确实是更好的选择。