搜索数组并测试是否相等

时间:2013-01-26 09:16:55

标签: ruby arrays

我有两个课程:ItemItemCollectionItem有几个属性:attr1attr2attr3等,而ItemCollection包含Item个实例的数组,还有一些操纵方法。

问题1:这是处理对象集合的适当方法吗?

我想要一个方法:ItemCollection#itemExists(needleItem),如果对true个实例的数组中的某个项needleItem.attr1 == attr1返回ItemCollection

问题2:最好的方法是什么?

4 个答案:

答案 0 :(得分:1)

看起来你可以算数。 http://ruby-doc.org/core-1.9.3/Array.html#method-i-count

简单的代码是:

def check_needle
  c = ItemCollection.count { |i|
      needleitem.attr1 == i.attr1 # Each time this value returns true it enumerates
  }

  c > 1
  # or 
  if c > 1 then return true end
end

我想针线在阵列中?如果是这样,c的任何大于1的计数应该没问题。如果不是,c的任何大于0的计数都应该满足。另外,你得到总数。

-Douglas

答案 1 :(得分:1)

  

问题1:这是处理对象集合的合适方法吗?

您可以从ItemCollection派生Array课程并免费获取其方法。

  

问题2:最好的方法是什么?

我看到两个选项(假设您遵循我之前的建议):

  1. 使用include?的简单迭代覆盖ItemCollection中的each方法:

    class ItemCollection < Array
      def include?(item)
        self.each do |i|
          return true if i.attr1 == item.attr1
        end
        return false
      end
    end
    
  2. Item个实例提供您自己的相等测试,并使用从include?派生的默认Array版本(Item s,等于attr1将始终被视为平等):

    class Item
      def initialize(attr1, attr2, attr3)
        @attr1, @attr2, @attr3 = attr1, attr2, attr3
      end
    
      attr_accessor :attr1, :attr2, :attr3
    
      def ==(another)
        self.attr1 == another.attr1
      end
    end
    

答案 2 :(得分:1)

如果ItemCollection只保存数组和一些方法(而没有其他相关数据) - 那么实际上不需要额外的类。只需使用数组并将方法定义为简单函数。

至于搜索阵列 - 道格拉斯答案可能是最好的。但是,另一种方法(可能效率较低)是使用Array#map从数组中的对象中提取attr1,然后array#include?来搜索所需的值。例如。

 collectionArray.map(&:attr1).include?(attr_to_find)

&:attr1语法相当于      {| x | x.attr1}

用于将对象数组映射到仅包含所需属性的数组中。

答案 3 :(得分:0)

ruby​​数组实例有100多个方法,不包括Object。其中许多都非常灵活。 any?方法(包含在enumerable中)采用一个块,允许您指定应该返回true的条件。

class Item < Struct.new(:attr1, :attr2)
end
p item_collection = Array.new(10){|n| Item.new(rand(10), n)}
#[#<struct Item attr1=7, attr2=0>, #<struct Item attr1=5, attr2=1>,
#<struct Item attr1=8, attr2=2>, #<struct Item attr1=3, attr2=3>, 
#<struct Item attr1=9, attr2=4>, #<struct Item attr1=8, attr2=5>, 
#<struct Item attr1=1, attr2=6>, #<struct Item attr1=6, attr2=7>, 
#<struct Item attr1=4, attr2=8>, #<struct Item attr1=6, attr2=9>]

p item_collection.any?{|i| i.attr1 == 3}
#true

当item_collection有一个非常特殊的方法时,可能是在item_collection数组上定义它:

def item_collection.very_special_method
  self.select{|i| i.attr1 == i.attr2}
end
p item_collection.very_special_method
# [#<struct Item attr1=3, attr2=3>]