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

Java 在保留大小的同时从数组中删除多个值?,java,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

这样做的明确方式是什么

对于学校作业,我必须创建一个包含整数数组的类,并添加一些方法,比如添加、删除等等,有点像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,我怀疑他们是否会检查我是否使用ArrayList,但如果能找到他们希望我使用的方法,那就太好了

从一个过于简单的角度来看,我只需遍历数组的索引并检查值是否存在

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

但我可能会选择第一个。

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

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

这里有一个简单的O(n)方法来实现所需的保持相同大小的数组语义。在纸上试一下,验证它是如何工作的,或者我没有把事情搞砸;-)

  • 迭代数组并跟踪“读取索引”和“写入索引”(两者最初都在数组的开头)

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

  • 将值从“读取索引”复制到“写入索引”

  • 增加“阅读索引”和“写作索引”,并从#2重复,直到满足#5

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

  • 如果不需要保留订单,则需要较少的移动,并且需要进行轻微的优化以避免移动,直到需要为止。(这也适用于带有修改停止条件的普通
    removeOne
    。)


    愉快的编码。

    如果这是家庭作业,你可能不应该使用ArrayUtils,即使你“在现实生活中”使用它。@pst我知道,我可能应该花更多的时间在数组上,并习惯于使用它们,但当我遇到这样的问题时,数组真的让我非常困惑。java数组是可变的吗?