如何从一个数组中移除奇数元素?

3

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

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

当我运行它时,它会给我一个数组的元素,其中包含原始数组中所有偶数,但在奇数所在的位置上是零。如何编写代码,以便不会有零出现,而奇数则被删除?

1
如果是作业,请打上作业标签。 - Paul Bellora
是的,我已经添加了标签。 - Dylan Broussard
4个回答

1

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

在你的实现中,你实际上并没有 删除 元素,而是跳过了奇数,并且由于 int[] 默认初始化为零,奇数原来所在的位置上出现了零。

你可以这样做:

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

我需要它能够适用于任何长度的数组,因此我需要它是通用的。 - Dylan Broussard
@DylanBroussard - Oscar只是给你一个例子来帮助你找出算法。第三段是一个好建议。 - Paul Bellora
@DylanBroussard 我编辑了我的答案并添加了更多细节,这是我能做的最多,因为这是一份作业。 - Óscar López

0

你在这里受到内存的限制了吗(作业要求)?

我会这样做(让它变得有点具有挑战性)。

  1. 对于每个需要删除的元素,在数组中将该元素设置为“0”或某个不存在的数字(例如,我们称之为“A”)。
  2. 一旦您拥有了这个更新后的原始数组,现在开始用下一个有效元素(例如A 1 2 A 4 5 A 6应变成1 2 4 5 6 A A A)覆盖此数组中的所有“A”。您可能需要在某些时候处理多个“A”出现。
  3. 您可以打印此数组直到遇到A(在相同的内存限制内工作),也可以将其复制到具有所需元素的新数组中。

虽然这个过程很复杂,但作为作业的一部分,它会给您一些真正的练习。


0

你的问题并没有说明你是否有任何限制使用算法的类型。假设你可以自由地做任何想做的事情,我建议你使用一个List来存储偶数值,当你遍历完整个数组时,将任何偶数复制到列表中。

有几种不同的List实现可以使用。我会让你自己去查一下哪些实现类最好用。提示-检查List的实现类的JavaDocs。

一旦你有了一个完整的List,其中包含所有的偶数,将其转换回一个数组就是一个相当简单的练习,只需使用toArray方法即可。同样,我会让你自己去找一些如何使用该方法的示例。提示-在StackOverflow上有几篇帖子使用它。

如果你受到结构类型的限制,只能使用数组,那么它很可能需要进行多次处理,在这个过程中,你需要为你的“偶数”数组使用一个单独的索引,一旦完成,你需要重新将数组复制到一个正确大小的最终数组中。

作为最后的建议,您可以使用Java 5+的增强型for-each循环语法来遍历整个数组,而不是使用索引式for循环,并简化索引需求。例如:
for(int value : input ){
  if( value % 2 == 0 ) 
     // do something
}

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

如果有什么不清楚的地方,请告诉我。


-1

你必须考虑到,像int这样的原始类型数组的字段不能为null、空或类似的值,它们必须是整数(在你的情况下是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]);
    }

2
这个问题被标记为作业。请提供指导而不是完整答案。 - Peter
1
我回答问题时并不是这样的! - marc wellman
2
直到一分钟前,它才被标记为作业。在Marc回答之后。 - Skip Head
即使这不是一个作业问题,由于只有代码而没有解释,它的质量也很差。 - Paul Bellora
我承认错误。我撤销了我的负评,但我认为PaulBellora有一点道理。 - Peter
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接