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]
答案 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