如果元素已经存在,则将元素添加到数组中

时间:2012-12-22 16:07:11

标签: 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_array_of_item1,但前提是unique_array_of_item1尚未包含item1。我知道一个简单的解决方案:只需遍历my_array并检查unique_array_of_item1是否已包含当前item1

有没有更有效的解决方案?

6 个答案:

答案 0 :(得分:98)

@Coorassegood answer,但应该是:

my_array | [item]

并更新my_array

my_array |= [item]

答案 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)