Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如果元素为';现在还没有_Ruby - Fatal编程技术网

Ruby 如果元素为';现在还没有

Ruby 如果元素为';现在还没有,ruby,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\u array\u of_item1,但前提是unique\u array\u of_item1尚未包含该item1。我知道有一个简单的解

我有一门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\u array\u of_item1
,但前提是
unique\u array\u of_item1
尚未包含该
item1
。我知道有一个简单的解决方案:只需遍历
我的\u数组
,检查\u item1的
唯一\u数组是否已经包含当前的
item1


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

您可以使用而不是数组。

您不需要手动遍历
我的数组

my_array.push(item1) unless my_array.include?(item1)
编辑:


正如Tombart在他的评论中指出的那样,使用
Array#include?
不是很有效。我想说,对于小型阵列,性能影响可以忽略不计,但是对于大型阵列,您可能希望使用
Set

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

my_array | [item1]
虽然它应该是:

my_array | [item]
要就地更新my_阵列,请执行以下操作:

my_array |= [item]

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

如果在原始数组中至少有一个不希望丢失的重复元素,那么以提前返回的方式遍历数组是最坏的情况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)

你肯定不想那样做<代码>数组。include?(item)
具有复杂性
O(n)
-因此它就像迭代整个数组一样。看看这个基准:漂亮的解决方案:)。可读!在我的例子中,我不能有一个集合,所以我使用这个解决方案。如果数组是有序的,你也可以使用二进制搜索来提高性能<代码>[1,2,3,4,5].b搜索{e | e==3}
这应该是我的错。很抱歉编辑应答器
my|array |=[item]
,该应答器将更新
my|array
,可能我遗漏了一些内容,但|=操作符似乎对我不起作用?我正在运行Ruby 2.1。1@Viet
|=
在我的2.1.1测试中运行良好。请描述您的测试用例或打开一个新问题。再次测试它,它现在就可以工作了。我不知道我之前在做什么,因为我的评论是在几个月前发表的。这有多复杂?虽然文档说集合不是有序的,但实际上它们是有序的(从Ruby 1.9开始)。如果您查看代码,您将使用的获取顺序的主要方法(例如
Set#each
Set#to_a
)委托给
@hash
。从Ruby 1.9开始,哈希是有序的。“散列按插入相应键的顺序枚举它们的值。”从未有过像集合这样的东西。他们太棒了,非常感谢你