从数组中删除一个元素

3

我有一个包含多个相同元素的数组。现在我想创建一个新的数组,其中删除了其中一个元素。

例如:

a = [1,1,1,2]
delete_index = a.find_index(1)
result = a.clone
result.delete_at(delete_index)
# result is now [1,1,2]

对于这么简单的任务,这段代码看起来真的很丑陋。我查看了数组提供的方法,但是找不到更好的做法。


对于 a = [1,1,1,2],结果应该是 [1,1,2] - Stefan
3个回答

2
a.delete_at(a.index(1) || a.length)

a.length 处理了元素未找到的情况;因为它超出了范围,所以不会删除任何内容,返回值将为 nil

如果你想对数组的副本进行操作,只需在 clone 上调用即可:

a2 = a.clone ; a2.delete_at(...)

如果您想对每个重复元素执行此操作,可以将其链接到一个选择重复元素的块中:
a.select { |e| array.count(e) > 1 }.each { |dup| a.delete_at a.index(dup) }

1
链式克隆不起作用,因为delete_at返回已删除的元素而不是数组的其余部分。 - FlyingFoX
好的点子。编辑后可以跟踪复制的数组的方法。 - davidcelis
1
请注意第三种解决方案的时间复杂度为O(n^2),对于更大的数组性能将非常低下。 - Andrew Marshall

1
你可以使用猴子补丁来修改数组:
class Array
  def delete_first_occurrence(o)
    delete_at(find_index(o) || length)
    self
  end
end

a = [1,1,1,2]
result = a.clone.delete_first_occurrence(1)
 => [1, 1, 2]

1
你可能想要保护这个代码:a.clone.delete_first_occurrence(3) #=> TypeError: no implicit conversion from nil to integer - Michael Kohl
@Michael Kohl - 谢谢您先生。根据davidcelis的建议添加了保障措施。 - seph

0

我不是很确定,但听起来好像你只是想从数组中删除重复项。如果是这种情况,那么只需使用array.uniq即可,它将返回一个新的数组,并删除所有重复项。如果您想直接修改原始数组,请改用array.uniq!

如果这不是您要完成的任务,请使用一些示例输入和输出更新您的问题。


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