gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:54:37 24 4
gpt4 key购买 nike

执行此操作的明确方法是什么?

对于学校作业,我必须创建一个包含整数数组的类,并添加添加、删除等方法。有点像 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,但如果能弄清楚如何按照他们想要的方式做到这一点,那就太好了。

最佳答案

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

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

  1. 迭代数组并跟踪“读取索引”和“写入索引”(两者最初都位于数组的开头)。

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

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

  4. 增加“阅读指数”和“写作指数”,从#2开始重复,直到满足#5为止。

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

如果不需要保留顺序,则需要较少的移动,并且需要进行轻微的优化以避免在需要时移动。 (这也适用于具有修改后的停止条件的普通 removeOne。)

祝你编码愉快。

关于java - 从数组中删除多个值同时保留大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8948319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com