如何检查我的数组是否包含对象?

nec*_*ker 73 ruby ruby-on-rails

我有一个数组@horses = [],我填写了一些随机的马.

如何检查我的@horses阵列是否包含已包含(存在)的马?

我尝试过类似的东西:

@suggested_horses = []
  @suggested_horses << Horse.find(:first,:offset=>rand(Horse.count))
  while @suggested_horses.length < 8
    horse = Horse.find(:first,:offset=>rand(Horse.count))
    unless @suggested_horses.exists?(horse.id)
       @suggested_horses<< horse
    end
  end
Run Code Online (Sandbox Code Playgroud)

我也试过,include?但我看到它仅用于字符串.随着exists?我得到以下错误:

undefined method `exists?' for #<Array:0xc11c0b8>
Run Code Online (Sandbox Code Playgroud)

所以问题是如何检查我的阵列是否已经包含"马",以便我不会用同一匹马填充它?

Tom*_*iło 172

Ruby中的数组没有exists?方法,但它们有一个文档中描述include?方法.就像是

unless @suggested_horses.include?(horse)
   @suggested_horses << horse
end
Run Code Online (Sandbox Code Playgroud)

应该开箱即用.

  • 它是时间线性的,它在每个项目上列出一次.尽管如此,对性能的挑剔没有任何意义.这是一个如此简单的案例.如果你关心快速查找使用[`Hash`](http://www.ruby-doc.org/core-2.1.1/Hash.html)或[`Set`](http://www.ruby)来自`std-lib`的-doc.org/stdlib-2.1.1/libdoc/set/rdoc/Set.html). (7认同)
  • 反过来:除非是horse.in?(@ sales_horses)@suggested_horses << horse end (3认同)
  • @Kush:同意,O(n)并不理想.但是,如果我们短路,avg的情况仍然是O(n);)最后,我们选择用Ruby编写(所有的langs ......) (2认同)

And*_*rew 14

如果要通过检查对象上的属性来检查对象是否在数组中,可以使用any?并传递一个计算结果为true或false的块:

unless @suggested_horses.any? {|h| h.id == horse.id }
  @suggested_horses << horse
end
Run Code Online (Sandbox Code Playgroud)