是否有方法只删除1个匹配的数组元素?

时间:2014-06-05 03:35:43

标签: ruby arrays

e.g。 a = [1,2,3,1]

如果您使用a.delete 1,则结果为a = [2,3]

是否有一种方法可以从数组中删除限制?伪代码:

a = [1,2,3,4,1]
a.delete(1, *limit 1*) 
#=> [2,3,4,1]

4 个答案:

答案 0 :(得分:7)

我可以想到一个想法 -

n.times { array.delete_at array.index(item) }

delete_at - 删除指定索引处的元素,返回该元素,如果索引超出范围则删除nil。

index - 返回ary中第一个对象的索引,使对象为== to obj。

您可以将逻辑包装在方法中,如下所示: -

def delete_with_limit(array, item, limit)
  count = array.count(item)
  raise "only #{count} is present, and you are expecting #{limit}" if limit > count
  limit.times { array.delete_at array.index(item) }
  array
end

array = [1,2,1,1,3,5]
delete_with_limit(array, 1, 2) # => [2, 1, 3, 5]
array = [1,2,1,1,3,5]
delete_with_limit(array, 1, 4)
#  `delete_with_limit': only 3 is present, and you are expecting 4 (RuntimeError)

答案 1 :(得分:1)

工作解决方案:

n = 1
a = [1,2,3,4,1]
a.delete_at(a.index(n) || a.length)

#=> [2,3,4,1]

答案 2 :(得分:1)

这是另一种方式。感谢@Uri对建议的改进。 (如果您对我最初的兴趣感兴趣,请参阅编辑历史。)

方式

def delete_some(arr, target, nbr_to_delete)
  arr.select { |e| e==target ?
                (nbr_to_delete > 0 ? (nbr_to_delete -= 1; false) : true) :
                true }
end

<强>实施例

a = [1,2,3,1,2,1,1,3]

delete_some(a,1,0) #=> [1, 2, 3, 1, 2, 1, 1, 3]
delete_some(a,1,1) #=> [2, 3, 1, 2, 1, 1, 3]
delete_some(a,1,2) #=> [2, 3, 2, 1, 1, 3]
delete_some(a,1,3) #=> [2, 3, 2, 1, 3]
delete_some(a,1,4) #=> [2, 3, 2, 3]
delete_some(a,1,5) #=> [2, 3, 2, 3]

答案 3 :(得分:0)

只删除一个:

if idx = a.index(n)
  a.delete_at(idx)
end

表示通用limit > 0

def delete_first(arr, item, limit = 1)
  arr.reject! { |i| i == item && (limit -= 1) >= 0 } 
end

进行额外优化(如果已经删除了所有相关元素,则不会通过所有数组):

def delete_first(arr, item, limit = 1)
  arr.reject! { |i| return arr if limit == 0; i == item && limit -= 1 }
end