我有一个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
。我知道一个简单的解决方案:只需遍历my_array
并检查unique_array_of_item1
是否已包含当前item1
。
有没有更有效的解决方案?
答案 0 :(得分:98)
答案 1 :(得分:77)
您可以使用Set代替数组。
答案 2 :(得分:36)
您无需手动迭代my_array
。
my_array.push(item1) unless my_array.include?(item1)
编辑:
正如Tombart在评论中指出的那样,使用Array#include?
效率不高。我会说对于小阵列,性能影响可以忽略不计,但是对于较大的阵列,您可能希望使用Set
。
答案 3 :(得分:29)
您可以将item1转换为数组并加入它们:
my_array | [item1]
答案 4 :(得分:3)
重要的是要记住Set类和|方法(也称为“Set Union”)将生成一个唯一元素的数组,如果您不需要重复项,这将是很好的,但如果您的原始数组中包含非唯一元素,这将是一个令人不快的惊喜按设计。
如果你原始数组中至少有一个你不想丢失的重复元素,那么在早期返回的情况下迭代数组就是最坏情况的O(n),这在大数据集中并不算太糟糕事物的方案。
class Array
def add_if_unique element
return self if include? element
push element
end
end
答案 5 :(得分:0)
我不确定它是否是完美的解决方案,但对我有用:
host_group = Array.new if not host_group.kind_of?(Array)
host_group.push(host)