Ruby 如果元素为';现在还没有
我有一门Ruby课程Ruby 如果元素为';现在还没有,ruby,Ruby,我有一门Ruby课程 class MyClass attr_writer :item1, :item2 end my_array = get_array_of_my_class() #my_array is an array of MyClass unique_array_of_item1 = [] 我想将MyClass#item1推送到unique\u array\u of_item1,但前提是unique\u array\u of_item1尚未包含该item1。我知道有一个简单的解
class MyClass
attr_writer :item1, :item2
end
my_array = get_array_of_my_class() #my_array is an array of MyClass
unique_array_of_item1 = []
我想将MyClass#item1
推送到unique\u array\u of_item1
,但前提是unique\u array\u of_item1
尚未包含该item1
。我知道有一个简单的解决方案:只需遍历我的\u数组
,检查\u item1的唯一\u数组是否已经包含当前的item1
有没有更有效的解决方案?您可以使用而不是数组。您不需要手动遍历我的数组
my_array.push(item1) unless my_array.include?(item1)
编辑:
正如Tombart在他的评论中指出的那样,使用Array#include?
不是很有效。我想说,对于小型阵列,性能影响可以忽略不计,但是对于大型阵列,您可能希望使用Set
您可以将item1转换为数组并加入它们:
my_array | [item1]
虽然它应该是:
my_array | [item]
要就地更新my_阵列,请执行以下操作:
my_array |= [item]
重要的是要记住,Set类和|方法(也称为“Set Union”)将生成一个唯一元素的数组,如果您不希望重复,这非常好,但是如果您的原始数组中设计了非唯一元素,这将是一个令人不快的惊喜
如果在原始数组中至少有一个不希望丢失的重复元素,那么以提前返回的方式遍历数组是最坏的情况O(n),这在总体方案中并不太糟糕
class Array
def add_if_unique element
return self if include? element
push element
end
end
我不确定这是否是一个完美的解决方案,但对我来说很有效:
host_group = Array.new if not host_group.kind_of?(Array)
host_group.push(host)
你肯定不想那样做<代码>数组。include?(item)
具有复杂性O(n)
-因此它就像迭代整个数组一样。看看这个基准:漂亮的解决方案:)。可读!在我的例子中,我不能有一个集合,所以我使用这个解决方案。如果数组是有序的,你也可以使用二进制搜索来提高性能<代码>[1,2,3,4,5].b搜索{e | e==3}
这应该是我的错。很抱歉编辑应答器my|array |=[item]
,该应答器将更新my|array
,可能我遗漏了一些内容,但|=操作符似乎对我不起作用?我正在运行Ruby 2.1。1@Viet|=
在我的2.1.1测试中运行良好。请描述您的测试用例或打开一个新问题。再次测试它,它现在就可以工作了。我不知道我之前在做什么,因为我的评论是在几个月前发表的。这有多复杂?虽然文档说集合不是有序的,但实际上它们是有序的(从Ruby 1.9开始)。如果您查看代码,您将使用的获取顺序的主要方法(例如Set#each
和Set#to_a
)委托给@hash
。从Ruby 1.9开始,哈希是有序的。“散列按插入相应键的顺序枚举它们的值。”从未有过像集合这样的东西。他们太棒了,非常感谢你