如果元素不存在,则将其添加到数组中
我有一个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_array_of_item1
,但只有当unique_array_of_item1
尚未包含该item1
。 有一个简单的解决scheme,我知道:只需遍历my_array
并检查unique_array_of_item1
已经包含当前item1
或不。
有没有更有效的解决scheme?
您可以使用Set而不是Array。
Coorasse有一个很好的答案,但它应该是:
my_array | [item]
你不需要手工迭代my_array
。
my_array.push(item1) unless my_array.include?(item1)
编辑:
正如Tombart在他的评论中指出的那样,使用Array#include?
#include Array#include?
效率不高。 我认为小arrays对性能的影响是微不足道的,但是您可能想要使用Set
来Set
更大的arrays。
您可以将item1转换为数组并join它们:
my_array | [item1]
重要的是要记住Set类和| 方法(也称为“设置联合”)将产生一个独特的元素数组,这是非常好的,如果你不想重复,但如果你的原始数组中有非独特的元素devise,这将是一个不愉快的惊喜。
如果原始数组中至less有一个不想丢失的重复元素,那么使用提前返回遍历数组是最糟糕的O(n),这在事物的macros观scheme中并不算太坏。
class Array def add_if_unique element return self if include? element push element end end
我不确定是否是完美的解决scheme,但为我工作:
host_group = Array.new if not host_group.kind_of?(Array) host_group.push(host)