我在Ruby中有一系列元素
[2,4,6,3,8]
Run Code Online (Sandbox Code Playgroud)
我需要删除具有值的元素,3例如
我怎么做?
Tam*_*iev 451
我想我已经弄明白了:
a = [2,4,6,3,8]
a.delete(3)
Run Code Online (Sandbox Code Playgroud)
Abr*_*ram 213
在评论中借用特拉维斯,这是一个更好的答案:
我个人喜欢
[1, 2, 7, 4, 5] - [7]哪种结果=> [1, 2, 4, 5]来自irb
我修改了他的答案,看到3是他的示例数组中的第三个元素.对于那些没有意识到3在阵列中的位置2的人来说,这可能会导致一些混乱.
Ste*_*eve 65
另外一个选项:
a = [2,4,6,3,8]
a -= [3]
Run Code Online (Sandbox Code Playgroud)
结果
=> [2, 4, 6, 8]
Run Code Online (Sandbox Code Playgroud)
小智 41
我不确定是否有人说过这个,但Array.delete()和 - = value将删除Array中传递给它的每个值的实例.为了删除特定元素的第一个实例,您可以执行类似的操作
arr = [1,3,2,44,5]
arr.delete_at(arr.index(44))
#=> [1,3,2,5]
Run Code Online (Sandbox Code Playgroud)
可能有一种更简单的方法.我不是说这是最佳做法,但它应该被认可.
Say*_*yan 28
假设你想在数组的多个位置删除3个值,我认为执行此任务的ruby方法是使用delete_if方法:
[2,4,6,3,8,3].delete_if {|x| x == 3 }
Run Code Online (Sandbox Code Playgroud)
您还可以使用delete_if删除"数组数组"方案中的元素.
希望这能解决您的疑问
bar*_*lop 24
我喜欢-=[4]在其他答案中提到的删除值为4的元素的方法.
但有这种方式:
irb(main):419:0> [2,4,6,3,8,6].delete_if{|i|i==6}
=> [2, 4, 3, 8]
irb(main):420:0>
Run Code Online (Sandbox Code Playgroud)
在提到函数后,在" 基本数组操作 " 中的某处提到过map.
the*_*Man 14
以下是一些基准测试:
require 'fruity'
class Array
def rodrigo_except(*values)
self - values
end
def niels_except value
value = value.kind_of?(Array) ? value : [value]
self - value
end
end
ARY = [2,4,6,3,8]
compare do
soziev { a = ARY.dup; a.delete(3); a }
steve { a = ARY.dup; a -= [3]; a }
barlop { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
rodrigo { a = ARY.dup; a.rodrigo_except(3); }
niels { a = ARY.dup; a.niels_except(3); }
end
# >> Running each test 4096 times. Test will take about 2 seconds.
# >> soziev is similar to barlop
# >> barlop is faster than steve by 2x ± 1.0
# >> steve is faster than rodrigo by 4x ± 1.0
# >> rodrigo is similar to niels
Run Code Online (Sandbox Code Playgroud)
再次使用包含大量重复项的更大数组:
class Array
def rodrigo_except(*values)
self - values
end
def niels_except value
value = value.kind_of?(Array) ? value : [value]
self - value
end
end
ARY = [2,4,6,3,8] * 1000
compare do
soziev { a = ARY.dup; a.delete(3); a }
steve { a = ARY.dup; a -= [3]; a }
barlop { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
rodrigo { a = ARY.dup; a.rodrigo_except(3); }
niels { a = ARY.dup; a.niels_except(3); }
end
# >> Running each test 16 times. Test will take about 1 second.
# >> steve is faster than soziev by 30.000000000000004% ± 10.0%
# >> soziev is faster than barlop by 50.0% ± 10.0%
# >> barlop is faster than rodrigo by 3x ± 0.1
# >> rodrigo is similar to niels
Run Code Online (Sandbox Code Playgroud)
更重要的是更大的重复:
class Array
def rodrigo_except(*values)
self - values
end
def niels_except value
value = value.kind_of?(Array) ? value : [value]
self - value
end
end
ARY = [2,4,6,3,8] * 100_000
compare do
soziev { a = ARY.dup; a.delete(3); a }
steve { a = ARY.dup; a -= [3]; a }
barlop { a = ARY.dup; a.delete_if{ |i| i == 3 }; a }
rodrigo { a = ARY.dup; a.rodrigo_except(3); }
niels { a = ARY.dup; a.niels_except(3); }
end
# >> Running each test once. Test will take about 6 seconds.
# >> steve is similar to soziev
# >> soziev is faster than barlop by 2x ± 0.1
# >> barlop is faster than niels by 3x ± 1.0
# >> niels is similar to rodrigo
Run Code Online (Sandbox Code Playgroud)
小智 7
我改进了Niels的解决方案
class Array
def except(*values)
self - values
end
end
Run Code Online (Sandbox Code Playgroud)
现在你可以使用了
[1, 2, 3, 4].except(3, 4) # return [1, 2]
[1, 2, 3, 4].except(4) # return [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
如果您还想让此删除操作可链接,以便您可以删除某些项目并继续对结果数组进行链接操作,请使用tap:
[2, 4, 6, 3, 8].tap { |ary|\xc2\xa0ary.delete(3) }.count #=> 4\nRun Code Online (Sandbox Code Playgroud)\n
小智 7
在 ruby 中编译所有不同的删除选项
delete - 按值删除匹配的元素。如果有多个值匹配,它将删除所有值。如果您不关心出现次数或确定单次出现,请使用此方法。
a = [2, 6, 3, 5, 3, 7]
a.delete(3) # returns 3
puts a # return [2, 6, 5, 7]
Run Code Online (Sandbox Code Playgroud)
delete_at - 删除给定索引处的元素。如果您知道索引,请使用此方法。
# continuing from the above example
a.delete_at(2) # returns 5
puts a # returns [2, 6, 7]
Run Code Online (Sandbox Code Playgroud)
delete_if - 删除块为真的每个元素。这将修改数组。调用块时,数组会立即更改。
b = [1, 2, 5, 4, 9, 10, 11]
b.delete_if {|n| n >= 10}. # returns [1, 2, 5, 4, 9]
Run Code Online (Sandbox Code Playgroud)
拒绝- 这将返回包含给定块为假的元素的新数组。顺序是这样维护的。
c = [1, 2, 5, 4, 9, 10, 11]
c.reject {|n| n >= 10}. # returns [1, 2, 5, 4, 9]
Run Code Online (Sandbox Code Playgroud)
拒绝!- 与delete_if相同。调用块时,数组可能不会立即更改。
如果要从数组中删除多个值,最好的选择如下。
a = [2, 3, 7, 4, 6, 21, 13]
b = [7, 21]
a = a - b # a - [2, 3, 4, 6, 13]
Run Code Online (Sandbox Code Playgroud)