为什么此代码不起作用? 我应该写一个从数组中删除奇数的函数。这是我的代码,但我不知道哪里出了问题。这给我一个错误。
public class Test{
public static int [] removeOdd(int[] input){
int c = 0;
for(int i=0; i<input.length; i++){
if(input[i]%2==0){
c++;
}
}
int [] a = new int[c];
for(int i=0; i<input.length; i++){
if(input[i]%2==0){
a[i] = input[i];
}
}
return a;
}
public static void main(String [] args){
int [] mixedArray = {21, 33, 44, 66, 11, 1, 88, 45, 10, 9};
for (int i = 0; i < mixedArray.length; i++) {
System.out.print(mixedArray[i] + " ");
}
System.out.println();
int [] noOdd = Test.removeOdd(mixedArray);
for (int i = 0; i < noOdd.length; i++) {
System.out.print(noOdd[i] + " ");
}
}
先谢谢您了:)
答案 0 :(得分:2)
问题在这里:
int [] a = new int[c];
for(int i=0; i<input.length; i++){
if(input[i]%2==0){
a[i] = input[i];
}
}
此循环将遍历整个input
数组,并尝试仅将偶数插入a
中,但是a
小于input
,因为已分配空间等于input
中偶数的数量。
在您的测试用例中,您的a
的大小为4,但会尝试访问位置6,从而为您提供了超出范围的异常。
答案 1 :(得分:1)
您需要另一个索引变量来访问a
的项目,并且不使用i
:
public static int [] removeOdd(int[] input){
int c = 0;
for(int i=0; i<input.length; i++){
if(input[i]%2==0){
c++;
}
}
int [] a = new int[c];
int k = 0;
for(int i=0; i<input.length; i++){
if(input[i]%2==0){
a[k] = input[i];
k++;
}
}
return a;
}
索引变量i
遍历input
,其值不匹配,并且将超过a
的索引的允许值,因此我使用了k
。 / p>
答案 2 :(得分:1)
问题是您试图插入a[i]
,您可以像这样可视化:
index: 0 1 2 3 4
input: [1 2 3 4 5]
a: [ 2 4 ]
但是,您的a
数组小于输入数组,因为您减小了大小以解决缺少奇数的问题。您实际上是想这样做:
index: 0 1 2 3 4
input [1 2 3 4 5]
a [2 4]
请注意两个偶数的索引如何更改。您试图将其保持不变。
解决此问题的一种方法是保留一个单独的计数器变量,该变量可在插入a
时跟踪您的位置。
int[] a = new int[c];
int sizeOfA = 0;
for (int i = 0; i < input.length; i++)
{
if (input[i] % 2 == 0)
{
a[sizeOfA] = input[i];
sizeOfA++;
}
}
答案 3 :(得分:1)
您可以使用流来简化方法removeOdd
:
import java.util.Arrays;
public class Test {
public static int[] removeOdd(int[] input) {
return Arrays.stream(input).filter(i -> i % 2 == 0).toArray();
}
public static void main(String[] args) {
int[] mixedArray = { 21, 33, 44, 66, 11, 1, 88, 45, 10, 9 };
for (int i = 0; i < mixedArray.length; i++) {
System.out.print(mixedArray[i] + " ");
}
System.out.println();
int[] noOdd = Test.removeOdd(mixedArray);
for (int i = 0; i < noOdd.length; i++) {
System.out.print(noOdd[i] + " ");
}
}
}