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

Ala*_*ano 85 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 = []
Run Code Online (Sandbox Code Playgroud)

我要推MyClass#item1unique_array_of_item1,但前提是unique_array_of_item1不包含item1尚未.我知道有一个简单的解决方案:只需迭代my_array并检查是否unique_array_of_item1已包含当前item1.

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

Jas*_*ney 108

@Coorasse有一个很好的答案,虽然它应该是:

my_array | [item]
Run Code Online (Sandbox Code Playgroud)

并更新my_array到位:

my_array |= [item]
Run Code Online (Sandbox Code Playgroud)

  • 或者`my_array | = [item]`将更新`my_array` (61认同)
  • 也许我在这里遗漏了一些东西,但是| =运算符似乎对我不起作用?我正在运行Ruby 2.1.1 (2认同)
  • 这有什么复杂性? (2认同)

Jiř*_*šil 81

您可以使用Set而不是Array.


doe*_*err 37

您不需要my_array手动迭代.

my_array.push(item1) unless my_array.include?(item1)
Run Code Online (Sandbox Code Playgroud)

编辑:

正如Tombart在评论中指出的那样,使用Array#include?效率不高.我会说小阵列的性能影响可以忽略不计,但你可能想要Set更大的阵容.

  • 你绝对不想那样做!`array.include?(item)`有复杂性`O(n)` - 所以就像迭代整个数组一样.看看这个基准:https://gist.github.com/deric/4953652 (5认同)

coo*_*sse 30

您可以将item1转换为数组并加入它们:

my_array | [item1]
Run Code Online (Sandbox Code Playgroud)