如何从数组中删除奇值元素?

时间:2012-01-19 02:29:40

标签: java arrays

我的目标是编写一个方法,创建一个删除了奇数的数组副本。这是我的代码:

public class Evens {
    static int[] evens(int[] input) {
        final int n = input.length;
        int[] output = new int[n];
        for(int i=0;i<n;i++) {
            if(input[i]%2 == 0)
                output[i] = input[i];
        }
        return output;
    }
    public static void main(String[] args) {
        int[] fvalues = new int[] {4,7,9,3,6,8,2};
        int[] evalues = evens(fvalues);
        for(int i=0;i<evalues.length;i++)
            System.out.println(i+"] "+evalues[i]);
    }
}

当我运行它时,它给了我一个数组的元素,其中包含原始数组的所有偶数,但奇数是奇数。我该怎么写呢,所以没有奇数就没有了?

4 个答案:

答案 0 :(得分:1)

要删除元素,最好使用ArrayList,因为数组无法更改其大小。如果必须使用数组,则output数组必须短于input。比如,如果您要删除三个元素,则output的大小必须为input.length-3

在你的实现中,你实际上并没有删除元素,你只是跳过奇数,并且因为int[]默认初始化为零,所以奇数的地方过去,数字会以零填充。

你可以这样做:

  1. 计算偶数元素的数量
  2. 使用上一步中找到的长度创建一个新的输出数组
  3. 仅将偶数复制到输出数组。这有点棘手,因为你需要使用两个索引(但只有一个for循环):一个索引用于迭代输入数组,另一个用于迭代输出数组 - 对于迭代的每个步骤,输入数组的索引都会像往常一样递增,但是在向输出添加新的偶数元素之后,输出数组的索引仅增加

答案 1 :(得分:0)

你是否受到记忆的约束(这个家庭作业的要求)?

我会这样做(使其具有挑战性)。

  1. 对于您需要删除的每个元素,请将此元素设置为“0”或将某个不存在的元素设置为“0”。 (让我们在数组中称之为'A')。
  2. 一旦你有了这个更新的原始数组,现在开始用下一个有效元素覆盖这个数组中的所有'A'(例如A 1 2 A 4 5 A 6应该变成1 2 4 5 6 A A A)。您可能必须在某个时间点处理多个“A”事件
  3. 您可以打印此数组,直到您点击A(使用相同的内存约束)或复制到具有所需元素的新数组。
  4. 这个过程虽然很复杂,但会将一些实际操作作为家庭作业的一部分。

答案 2 :(得分:0)

您的问题并不表示您是否对可以使用的算法类型有任何限制。假设您可以自由地执行任何操作,我建议您在迭代整个数组时使用List存储偶数值,并将任何偶数复制到列表中。

您可以使用几种不同的List实现。我会留给你做一些小腿,确定哪一个最好用。提示 - 检查JavaDocs是否实现了List的类。

一旦你有一个包含所有偶数的完整List,使用toArray方法将其转换回数组是一项相当简单的练习。再次,我将留给你做一些小腿,找到如何使用该方法的例子。提示 - StackOverflow上有几个帖子使用它。

如果您仅限于可以使用的结构类型,并且只能使用数组,那么它可能需要是一个多遍过程,在该过程中,您为“偶数”数组使用单独的索引完成后,您需要将数组重新复制到适当大小的最终数组。

作为最后的建议,您可以使用Java 5+ for-each增强循环语法,并简化索引需求,而不是使用循环索引来循环遍历整个数组。例如:

for(int value : input ){
  if( value % 2 == 0 ) 
     // do something
}

这将消除至少一个令人困惑的指数。作为一个有趣的练习,看看你是否可以使用我上面提到的一些建议来编写你的函数而不需要任何循环索引。

如果有不明确的地方,请告诉我。

答案 3 :(得分:-1)

您必须考虑像int这样的基本类型数组的字段不能为空,空或类似的东西,它们必须是整数(在您的情况下为0)。

此外,数组的大小从声明时开始固定,将来也无法更改。

如果你想生成一个只包含列表偶数的数组,你说的是一个字段较少的数组,即较小的数组,所以我想很明显你必须生成一个新数组来解决你分配...

一些简单的提示:

public class Evens {
    static int[] evens(int[] input) {
        final int n = input.length;

        int[] output = new int[n];

        // consider adding some additional lines

        }
        // return ...
        // hint: use something slightly different that your output array
     }
    public static void main(String[] args) {
         int[] fvalues = new int[] {4,7,9,3,6,8,2};
         int[] evalues = evens(fvalues);
         for(int i=0;i<evalues.length;i++)
             System.out.println(i+"] "+evalues[i]);
    }
相关问题