在我的程序中,我需要一个for-each循环,它计算给定数组中的均匀数,并为每个循环增加变量even
。当我使用标准for
循环,即(i = 0; i < numbers.length; i++;)
时,代码工作正常。但是,我的作业要求我为这个特定问题使用for-each循环。我做错了吗?
int [] numbers = new int[8];
int even = 0;
int odd = 0;
for (int i = 0; i < numbers.length; i++) {
numbers[i] = (int)(Math.random() * 51 + 50);
}
for (int i : numbers) {
if (numbers[i] % 2 == 0) {
even++;
}
else
odd++;
这会引发错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 54
答案 0 :(得分:5)
if (numbers[i] % 2 == 0) {
在foreach循环中,您无需使用索引访问它。只要i
就足够了,因为foreach keep会在你正在使用的数组/集合中直接给你element
(而不是索引)。
if (i % 2 == 0) {
for (int i : numbers) {
if (i % 2 == 0) {
even++;
}
else{
odd++;
}
}
实际上,通过检查第一个循环本身的偶数或奇数,可以完全消除第二个循环,从而缩短代码。
答案 1 :(得分:5)
对于您案例中的每个循环,将解释如下:
for (int i : numbers) {
数组中的每个整数都将逐一放入i
所以,你做错了是:
if (numbers[i] % 2 == 0) {
for (int i : numbers) {
if (numbers[i] % 2 == 0) {
even++;
}
else {
odd++;
}
i
不会像传统的for循环那样增加evrytime循环,此处i
带有实际值
因此您应该从numbers[i]%2==0
更改为i%2==0
for (int i : numbers) {
if (i % 2 == 0) {
even++;
}
else {
odd++;
}
答案 2 :(得分:1)
i
是数字本身,而不是索引。所以你应该:
for (int i : numbers) {
if (i % 2 == 0) { // <-- use i not numbers[i]
even++;
}
else {
odd++;
}
}
答案 3 :(得分:1)
代替numbers[i]
中的if (numbers[i] % 2 == 0)
,只需放入i
。
i
中的for (int i : numbers)
实际上将元素存储在数组(numbers)
中,从0th
索引到数组的length
。>
在if (numbers[i] % 2 == 0)
中,numbers[i]
将为您提供ith
索引处的元素。并且i
的值是一个来自(int)(Math.random() * 51 + 50)
的随机数,它将总是比number
大50
。因此,您要尝试访问的元素超出了您声明的数组大小的范围,即8
中的int [] numbers = new int[8]
。
答案 4 :(得分:0)
对于每个循环,无需提供数字[i],因此请使用以下代码 对于(int i:numbers),int i是数组中出现的数字。所以只是把数字本身放在数字上。如果您正在使用数字[i],那么它将检查第i个索引的值,如果任何数字大于您的数组大小,它将抛出ArrayOutOfBox异常。
int [] numbers = new int[8];
int even = 0;
int odd = 0;
for (int i = 0; i < numbers.length; i++) {
numbers[i] = (int)(Math.random() * 51 + 50);
}
for (int i : numbers) {
if (i % 2 == 0) {
even++;
}
else
odd++;
答案 5 :(得分:0)
虽然有很多答案。您也可以通过使用java-8流来实现相同的目的。使用reducer来找出偶数的数量,然后从长度中减少偶数的计数以得到奇数。
见下面的代码: -
int[] numbers = new int[8];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = (int) (Math.random() * 51 + 50);
}
int even = Arrays.stream(numbers)
.reduce(0, (a, b) -> {
a += b % 2 == 0 ? 1 : 0;
return a;
});
int odd = numbers.length - even;