Java从混合数组中删除奇数

时间:2019-02-20 18:06:48

标签: java arrays

为什么此代码不起作用? 我应该写一个从数组中删除奇数的函数。这是我的代码,但我不知道哪里出了问题。这给我一个错误。

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] + " ");
    }    
}

先谢谢您了:)

4 个答案:

答案 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] + " ");
        }
    }
}