在保留大小的同时从数组中删除多个值?

时间:2012-01-20 21:51:10

标签: java

这样做有什么明确的方法?

对于学校作业,我必须创建一个包含整数数组的类,并添加添加到其中的方法,删除等等。有点像ArrayList。但问题是,他们希望我创建一个removeAll(int val)方法,从列表中删除所有出现的val。例如,removeAll(4)将更改

{1, 2, 4, 6, 3, 4, 4, 6, 5, 6, 4} to
{1, 2, 6, 3, 6, 5, 6, 0, 0, 0, 0}.

对于我的常规remove()方法,我使用Apache Common的Lang ArrayUtils类来删除元素。由于某种原因,用它删除所有元素并不完全有效。我目前的攻击计划是找出val出现在阵列中的次数,然后多次调用ArrayUtils.remove()。但它给了我奇怪的结果,例如缩小阵列。还有其他任何攻击方式吗?据说我不能使用ArrayList,我怀疑他们会检查我是不是,但是按照他们想要的方式弄清楚如何做到这一点会很好。

3 个答案:

答案 0 :(得分:2)

使用ArrayUtils.remove时数组收缩的原因是返回了一个没有索引的新数组 :结果数组的大小比输入数组的大小小1 。另请注意,它需要索引而不是值才能删除,因此result = ArrayUtils.remove(input, 4)会删除第5个元素,而不会删除值为{{1}的元素}。

这是一种简单的O(n)方法,用于实现所需的keep-the-same-size-array语义。在纸上试一试,以验证它是如何工作的,或者我没有弄坏一些不好的东西; - )

  1. 遍历数组并继续跟踪“读取索引”和“写入索引”(最初都在数组的开头)。

  2. 对于“读取索引”处的每个元素,如果元素与要删除的元素匹配,则增加“读取索引”(但不是“写入索引”):要点是将旧值写入除去。

  3. 将值从“阅读索引”复制到“书写索引”。

  4. 增加“阅读索引”和“书写索引”,并从#2开始重复,直到满足#5。

  5. 当“读取索引”位于数组的末尾时,将“写入索引”中的0写入数组的末尾,因为这些索引中的内容已被复制。

  6. 如果不需要保留订单,则需要更少的移动,并且需要稍微优化以避免移动直到需要。 (这也适用于具有修改的停止条件的普通4。)

    快乐的编码。

答案 1 :(得分:0)

从简单的角度来看,我只是遍历数组的indeces并检查值是否存在。

如果你真的想变得复杂,你可以“存储”数组的值并将其映射到索引,这样你就可以知道值是哪些索引。

但我可能会选择第一个。

答案 2 :(得分:0)

嗯,这是家庭作业;-) 您可能想要做的是创建一个新数组,将所有元素复制到不同于给定参数的元素中,然后用零填充数组以匹配原始数组的长度。