我有一个 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
。
有没有更有效的解决方案?
您可以使用 Set 代替数组。
您不需要手动迭代
my_array
。
my_array.push(item1) unless my_array.include?(item1)
编辑:
正如 Tombart 在他的评论中指出的那样,使用
Array#include?
效率不是很高。我想说,对于小型数组来说,性能影响可以忽略不计,但对于较大的数组,您可能需要使用 Set
。
您可以将 item1 转换为数组并连接它们:
my_array | [item1]
重要的是要记住 Set 类和 |方法(也称为“Set Union”)将生成一个由unique元素组成的数组,如果您不想重复,这很好,但如果您的原始数组中设计有非唯一元素,这将是一个令人不快的惊喜。
如果原始数组中至少有一个您不想丢失的重复元素,那么在最坏情况下迭代数组并提前返回是 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)