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]

对于如此简单的任务,这段代码看起来真的很难看。我查看了 Array 提供的方法,但找不到更好的方法。

4

3 回答 3

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

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

如果您的部分问题是对数组的副本执行此操作,只需在 a 上调​​用它clone

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

如果要对每个重复元素执行此操作,可以将其链接到选择重复元素的块:

a.select { |e| array.count(e) > 1 }.each { |dup| a.delete_at a.index(dup) }
于 2012-06-18T15:56:29.360 回答
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]
于 2012-06-18T16:34:21.347 回答
0

我不太清楚,但听起来你只是想从数组中删除重复项。如果是这种情况,它就像 一样简单array.uniq,它将返回一个删除所有重复项的新数组。如果您想就地修改原始数组,则可以array.uniq!改用。

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

于 2012-06-18T15:55:20.810 回答