停止将重复项添加到Ruby对象数组中

时间:2010-05-10 16:10:22

标签: ruby-on-rails ruby

如何使用对象的属性来消除ruby对象数组中的重复元素以匹配相同的对象。

有一系列基本类型我可以使用一套..

例如

array_list = [1, 3, 4 5, 6, 6]
array_list.to_set 
=> [1, 2, 3, 4, 5, 6]

我可以使用这种技术来处理对象属性吗?

感谢

5 个答案:

答案 0 :(得分:3)

我认为你把车推到马前。你问自己:“我如何让uniq删除不相等的物体?”但你应该问自己的是:“为什么这两个对象不相等,尽管我认为它们是这样的?”

换句话说:看起来你正试图解决你的对象已经破坏了相等语义的事实,当你真正应该做的只是修复那些被破坏的那些等式语义。

以下是Product的示例,如果两个产品的类型编号相同,则视为相同:

class Product
  def initialize(type_number)
    self.type_number = type_number
  end

  def ==(other)
    type_number == other.type_number
  end

  def eql?(other)
    other.is_a?(self.class) && type_number.eql?(other.type_number)
  end

  def hash
    type_number.hash
  end

  protected

  attr_reader :type_number

  private

  attr_writer :type_number
end

require 'test/unit'
class TestHashEquality < Test::Unit::TestCase
  def test_that_products_with_equal_type_numbers_are_considered_equal
    assert_equal 2, [Product.new(1), Product.new(2), Product.new(1)].uniq.size
  end
end

答案 1 :(得分:2)

如果您可以将其写入对象以使用eql?,那么您可以使用uniq

答案 2 :(得分:0)

uniq

怎么样?
   a = [ "a", "a", "b", "b", "c" ]
   a.uniq   #=> ["a", "b", "c"]

你也可以在对象上使用它!

答案 3 :(得分:0)

您是否应该使用Array,还是应该使用Set?如果订单不重要,那么后者将更有效地检查重复。

答案 4 :(得分:-1)

感谢您的回复..一旦我将以下内容添加到我的对象模型

,uniq就可以了
def ==(other)
    other.class == self.class &&
    other.id  == self.id
end
alias :eql? :==