2010-05-10 5 views
1

동일한 객체와 일치하는 객체의 속성을 사용하여 루비 객체의 배열에서 중복 요소를 제거하려면 어떻게해야합니까?중복 객체가 Ruby 객체의 배열에 추가되지 않도록 하시겠습니까?

기본 유형 배열을 사용할 수 있습니다.

예 :

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

이 기술을 객체 속성으로 작업 할 수 있습니까?

감사

+1

참조 http://stackoverflow.com/questions/109781/uniq-by-object-attribute-in-ruby/113770#113770 – steenslag

답변

2

eql?을 사용하여 개체에 쓸 수있는 경우 uniq을 사용할 수 있습니다. 당신의 응답을

0

무엇

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

uniq에 대한

당신은뿐만 아니라 객체에 사용할 수 있습니다!

+0

그는 객체 속성을 언급 했으므로 완전한 객체가 동일하지 않을 것이라고 생각합니다. . – Beanish

+0

안녕 .. beanish 맞아 .. 예를 들어 개체 ID를 일치해야합니다 ... 내가 to_set 또는 uniq 방법으로 블록을 전달할 수 있습니까? – Dom

+0

@Dom : 블록을 'to_set'에 전달할 수있는 것 같습니다 : http://apidock.com/ruby/Enumerable/to_set. 정확히 무엇을하는지 보여주지는 않지만 문제를 해결할 것이라고 생각합니다. – ryeguy

-1

덕분에 .. UNIQ 한 번 나는 내 개체 모델

def ==(other) 
    other.class == self.class && 
    other.id == self.id 
end 
alias :eql? :== 
+1

이것은'Object # hash'의 계약과'Object # =='의 계약에 위배됩니다. –

3

난 당신이 말을하기 전에 카트를 가하고 있습니다 생각에 다음을 추가 작품. 당신은 자신에게 묻습니다 : "어떻게 uniq이 평등하지 않은 물체를 제거 할 수 있습니까?" 그러나 당신이 무엇을 해야 물어 봐야한다 : "나는 그 (것)들 고려하기에도 불구하고 왜 그 2 개의 목표가 동등하지 않은가?" 즉

: 당신이 당신이 정말 할 일은 단순히 그 깨진 평등의 의미 고정 당신의 객체가 평등의 의미를 파괴 한 사실, 해결하려고하는 것 같다.

여기가 동일한 유형 번호가있는 경우 두 제품이 동일한 것으로 간주됩니다 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 
+0

Jörg, 'use. type_number'를 사용하여 내 제품을 고유 한 용도로만 사용하려면 다른 필드를 사용하십시오 (예 : 다른 용도로'color')? 이상적으로, 정렬에 사용되는 비교 방법에 공통적 인 것처럼 블록을 사용할 수 있으면 좋을 것입니다. 어떤 아이디어? –

+0

안녕하세요. 이상 적으로 객체가 배열에 추가되는 것을 막기를 원합니다 (일치하는 속성을 기반으로). 나는 세트가 이것을 할 수도 있다고 생각했다. – Dom

0

당신이 Array를 사용 하는가를하거나 대신 Set를 사용 하는가? 순서가 중요하지 않은 경우, 후자는 중복을 확인하는 것이 더 효율적이됩니다.

관련 문제