从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确实维持了秩序。