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

问题描述 投票:0回答:6

我有一个 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

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

ruby
6个回答
164
投票

您可以使用

|
(联合):

my_array | [item]

并更新

my_array

my_array |= [item]

91
投票

您可以使用 Set 代替数组。


42
投票

您不需要手动迭代

my_array

my_array.push(item1) unless my_array.include?(item1)

编辑:

正如 Tombart 在他的评论中指出的那样,使用

Array#include?
效率不是很高。我想说,对于小型数组来说,性能影响可以忽略不计,但对于较大的数组,您可能需要使用
Set


35
投票

您可以将 item1 转换为数组并连接它们:

my_array | [item1]

4
投票

重要的是要记住 Set 类和 |方法(也称为“Set Union”)将生成一个由unique元素组成的数组,如果您不想重复,这很好,但如果您的原始数组中设计有非唯一元素,这将是一个令人不快的惊喜。

如果原始数组中至少有一个您不想丢失的重复元素,那么在最坏情况下迭代数组并提前返回是 O(n),这在总体方案中还算不错。东西。

class Array
  def add_if_unique element
    return self if include? element
    push element
  end
end

0
投票

我不确定这是否是完美的解决方案,但对我有用:

    host_group = Array.new if not host_group.kind_of?(Array)
    host_group.push(host)
© www.soinside.com 2019 - 2024. All rights reserved.