如果元素不存在,则将其添加到数组中

我有一个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#item1unique_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对性能的影响是微不足道的,但是您可能想要使用SetSet更大的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)