代码之家  ›  专栏  ›  技术社区  ›  Dom

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

  •  2
  • Dom  · 技术社区  · 15 年前

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

    有了一个基本类型的数组,我可以使用一个集合。

    如。

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

    我可以调整此技术以使用对象属性吗?

    谢谢

    5 回复  |  直到 15 年前
        1
  •  2
  •   ezpz    15 年前

    如果可以将其写入对象中以使用 eql? 然后你可以用 uniq .

        2
  •  3
  •   Jörg W Mittag    15 年前

    我想你把马车放在马前面了。你在问自己:“我怎么能得到 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
    
        3
  •  0
  •   Salil    15 年前

    怎么样 uniq

       a = [ "a", "a", "b", "b", "c" ]
       a.uniq   #=> ["a", "b", "c"]
    

    你也可以在物体上使用它!

        4
  •  0
  •   Andrew Grimm atk    15 年前

    你应该使用 Array 或者应该使用 Set 相反?如果顺序不重要,那么后者将使检查重复项更加有效。

        5
  •  -1
  •   Dom    15 年前

    谢谢你的回复。一旦我将以下内容添加到我的对象模型中,uniq就工作了

    def ==(other)
        other.class == self.class &&
        other.id  == self.id
    end
    alias :eql? :==
    
    推荐文章