Ruby 使用。包括?防止重复
对于如何使用Ruby 使用。包括?防止重复,ruby,Ruby,对于如何使用.include?来防止重复项目加入列表,我有点困惑 def add_item!(item, list) list << item end 我首先被告知在列表中添加一项 def add_item!(item, list) list << item end 您可以这样使用它: def add_item!(item, list) list << item unless list.include?(item) end def添加项目!(
.include?
来防止重复项目加入列表,我有点困惑
def add_item!(item, list)
list << item
end
我首先被告知在列表中添加一项
def add_item!(item, list)
list << item
end
您可以这样使用它:
def add_item!(item, list)
list << item unless list.include?(item)
end
def添加项目!(项目、清单)
listIr您只想维护数组,不知道是否添加了元素,您可以这样做
def add_item!(item, list)
list = list | [item]
end
在这里你可以找到一个例子
2.2.1 :001 > [1,2]
=> [1, 2]
2.2.1 :002 > [1,2] | [1]
=> [1, 2]
2.2.1 :003 > [1,2] | [1,3]
=> [1, 2, 3]
2.2.1 :004 >
ary |其他| ary→ 新德里
Set Union-通过将ary与其他ary合并,排除>任何重复项并保留原始数组的顺序,返回一个新数组
但是如果您想知道元素是否被拒绝,您可以这样做
def add_item!(item, list)
list << item unless list.include?(item)
end
def添加项目!(项目、清单)
list如果你想把代码放在一个方法中,你必须考虑到Ruby是通过值传递参数的,而不是通过引用。我不知道为什么在第一种情况下,这似乎有效,这本身就是一个问题。因此,我以第一个方法的名称结尾!(在适当的地方)但不是另外两个
我用三种不同的方法做了一些基准测试,包括?解决方案显然获胜。放置数组的初始值需要时间,但是所有的解决方案都必须这样做,这样您就可以放弃它
require 'set'
require 'benchmark'
def add_item1!(item, list)
list << item unless list.include?(item)
end
def add_item2(item, list)
list |= [item]
end
def add_item3(item, list)
set = Set.new(list)
set << item
list = set.to_a
end
array1 = [3,2,1,4]
add_item1!(2, array1) # [3, 2, 1, 4]
add_item1!(5, array1) # [3, 2, 1, 4, 5]
array2 = [3,2,1,4]
array2 = add_item2(2, array2) # [3, 2, 1, 4]
array2 = add_item2(5, array2) # [3, 2, 1, 4, 5]
array3 = [3,2,1,4]
array3 = add_item3(2, array3) # [3, 2, 1, 4]
array3 = add_item3(5, array3) # [3, 2, 1, 4, 5]
TESTS = 100000
Benchmark.bmbm do |results|
results.report("unless not new") {TESTS.times {array1 = [3,2,1,4];add_item1!(2, array1) }}
results.report("unless new") {TESTS.times{array1 = [3,2,1,4];add_item1!(5, array1) }}
results.report("|= not new") {TESTS.times{array2 = [3,2,1,4];array2 = add_item2(2, array2) }}
results.report("|= new") {TESTS.times{array2 = [3,2,1,4];array2 = add_item2(5, array2) }}
results.report("Set not new") {TESTS.times{array3 = [3,2,1,4];array3 = add_item3(2, array3) }}
results.report("Set new") {TESTS.times{array3 = [3,2,1,4];array3 = add_item3(5, array3) }}
end
# user system total real
# unless not new 0.031000 0.000000 0.031000 ( 0.027002)
# unless new 0.047000 0.000000 0.047000 ( 0.052003)
# |= not new 0.125000 0.000000 0.125000 ( 0.118007)
# |= new 0.125000 0.000000 0.125000 ( 0.126007)
# Set not new 0.358000 0.000000 0.358000 ( 0.354020)
# Set new 0.359000 0.000000 0.359000 ( 0.364021)
require'set'
需要“基准”
def添加_项1!(项目、清单)
列出你的问题是什么?使用集合而不是数组@NullSoulException set不能保证数组的有序性,这样的方法也应该有效=>>list |=[item]我完全忘记了,除非。但是,它返回nil
,而不是说orange
,作为一个项目。然后,当项目包括在内时,您可以使用if/else语句来执行一些特殊操作。请不要在询问问题后添加要求。我提供的代码可以防止重复请求。我只是不知道如何使用,除非使其返回nil
。我无意添加一个“要求”。关于接受rSV,我问了一个关于通过引用传递的问题,答案很好,但应该注意,如果你在列表中添加了几个项目,你会得到不同的结果。特别是,创建一个集合的设置成本很快就会产生回报。另一种可能是,根据应用程序的不同,随意添加,然后uniq
ifying。