从Ruby数组中删除元素

从Ruby数组中删除元素,ruby,arrays,Ruby,Arrays,假设我试图从数组a=[1,1,1,2,2,3]中删除元素。如果我执行以下操作: b = a - [1,3] 然后我会得到: b = [2,2] 然而,我希望结果是 b = [1,1,2,2] i、 e.我只删除减法向量中每个元素的一个实例,而不是所有情况。Ruby中有没有一种简单的方法可以做到这一点?您可以: a= [1,1,1,2,2,3] delete_list = [1,3] delete_list.each do |del| a.delete_at(a.index(del)

假设我试图从数组
a=[1,1,1,2,2,3]
中删除元素。如果我执行以下操作:

b = a - [1,3]
然后我会得到:

b = [2,2]
然而,我希望结果是

b = [1,1,2,2]
i、 e.我只删除减法向量中每个元素的一个实例,而不是所有情况。Ruby中有没有一种简单的方法可以做到这一点?

您可以:

a= [1,1,1,2,2,3]
delete_list = [1,3]
delete_list.each do |del|
    a.delete_at(a.index(del))
end
结果:[1,1,2,2]

您可以执行以下操作:

a= [1,1,1,2,2,3]
delete_list = [1,3]
delete_list.each do |del|
    a.delete_at(a.index(del))
end
结果:[1,1,2,2]

不是很简单,但:

a = [1,1,1,2,2,3]
b = a.group_by {|n| n}.each {|k,v| v.pop [1,3].count(k)}.values.flatten
=> [1, 1, 2, 2]
还处理“减数”中的倍数情况:

a = [1,1,1,2,2,3]
b = a.group_by {|n| n}.each {|k,v| v.pop [1,1,3].count(k)}.values.flatten
=> [1, 2, 2]
编辑:这更像是一种增强,它结合了Norm212和我的答案,形成了一个“功能性”解决方案

b = [1,1,3].each.with_object( a ) { |del| a.delete_at( a.index( del ) ) }
如果需要,将其放入lambda中:

subtract = lambda do |minuend, subtrahend|
  subtrahend.each.with_object( minuend ) { |del| minuend.delete_at( minuend.index( del ) ) }
end
然后:

不是很简单,但是:

a = [1,1,1,2,2,3]
b = a.group_by {|n| n}.each {|k,v| v.pop [1,3].count(k)}.values.flatten
=> [1, 1, 2, 2]
还处理“减数”中的倍数情况:

a = [1,1,1,2,2,3]
b = a.group_by {|n| n}.each {|k,v| v.pop [1,1,3].count(k)}.values.flatten
=> [1, 2, 2]
编辑:这更像是一种增强,它结合了Norm212和我的答案,形成了一个“功能性”解决方案

b = [1,1,3].each.with_object( a ) { |del| a.delete_at( a.index( del ) ) }
如果需要,将其放入lambda中:

subtract = lambda do |minuend, subtrahend|
  subtrahend.each.with_object( minuend ) { |del| minuend.delete_at( minuend.index( del ) ) }
end
然后:


我经常使用的一个简单解决方案:

arr = ['remove me',3,4,2,45]

arr[1..-1]

=> [3,4,2,45]

我经常使用的一个简单解决方案:

arr = ['remove me',3,4,2,45]

arr[1..-1]

=> [3,4,2,45]

为了提高速度,我将执行以下操作,这只需要通过两个阵列中的每个阵列一次。这种方法保持了秩序。我将首先展示不改变原始数组的代码,然后展示如何轻松地修改它以改变它

arr = [1,1,1,2,2,3,1]
removals = [1,3,1]

h = removals.group_by(&:itself).transform_values(&:size)
  #=> {1=>2, 3=>1} 
arr.each_with_object([]) { |n,a|
  h.key?(n) && h[n] > 0 ? (h[n] -= 1) : a << n }
  #=> [1, 2, 2, 1]

arr
  #=> [1, 1, 1, 2, 2, 3, 1] 
这使用了21世纪的方法(MRI v2.4中的新方法),但可以改为:

h = Hash[removals.group_by(&:itself).map { |k,v| [k,v.size] }]


为了提高速度,我将执行以下操作,这只需要通过两个阵列中的每个阵列一次。这种方法保持了秩序。我将首先展示不改变原始数组的代码,然后展示如何轻松地修改它以改变它

arr = [1,1,1,2,2,3,1]
removals = [1,3,1]

h = removals.group_by(&:itself).transform_values(&:size)
  #=> {1=>2, 3=>1} 
arr.each_with_object([]) { |n,a|
  h.key?(n) && h[n] > 0 ? (h[n] -= 1) : a << n }
  #=> [1, 2, 2, 1]

arr
  #=> [1, 1, 1, 2, 2, 3, 1] 
这使用了21世纪的方法(MRI v2.4中的新方法),但可以改为:

h = Hash[removals.group_by(&:itself).map { |k,v| [k,v.size] }]


所以数组减法实际上是不相交的集合?数组差分---返回一个新数组,它是原始数组的副本,删除其他数组中出现的任何项。(如果需要类似集合的行为,请参阅库类集合。)如果要删除
delete_list
中项目的所有实例,可以这样做
b=a.each.reject{| x | delete_list.each.include?x}
?如果您正在从
a
?@moopait中删除索引1和3,因为他正在从数组的开始到结束删除第一个出现的1和3。他实际上调用了delete_at,它删除了数组的索引,第一次出现1,然后出现3。因此,在本例中,他在(0)处发出a.delete\u,然后在(4)处发出a.delete\u,因此数组减法实际上是不相交集?数组差-返回一个新数组,它是原始数组的副本,删除其他数组中出现的任何项。(如果需要类似集合的行为,请参阅库类集合。)如果要删除
delete_list
中项目的所有实例,可以这样做
b=a.each.reject{| x | delete_list.each.include?x}
?如果您正在从
a
?@moopait中删除索引1和3,因为他正在从数组的开始到结束删除第一个出现的1和3。他实际上调用了delete_at,它删除了数组的索引,第一次出现1,然后出现3。在这种情况下,如果你减去
[1,1,3]
你想以
b=[1,2,2]
结束吗?或者这永远不会发生?如果你减去
[1,1,3]
你想得到
b=[1,2,2]
?或者这永远不会发生?不,顺序可以改变。看起来Norm212确实保持了秩序。不,秩序可以改变。看起来Norm212确实维持了秩序。