2013-02-28 2 views
3

나는 사용자 정의 클래스 Instruction을 보유하고 있습니다. 인스턴스는 배열로 초기화되고 수집됩니다. 중복 된 (모든 인스턴스 변수가 동일한) 인스턴스가 있으며이를 필터링하려고합니다.배열 (Ruby)의 고유 한 객체 인스턴스

class Instruction 
    attr_accessor :date, :group, :time 
    def initialize(date, group, time) 
     @date, @group, @time = date, group, time 
    end 
end 

instructions = Array.new 

instructions.push (Instruction.new('2000-01-01', 'Big', '10am')) 
instructions.push (Instruction.new('2000-01-01', 'Small', '9am')) 
instructions.push (Instruction.new('1999-09-09', 'Small', '4pm')) 
instructions.push (Instruction.new('2000-01-01', 'Small', '9am')) 

instructions.uniq.each {|e| puts "date: #{e.date} \tgroup: #{e.group} \ttime: #{e.time}"} 

내가 그러나 나는 아직도 출력에 반복되는 항목을 참조 .uniq에 의해 제거 '2000-01-01', 'Small', '9am' 항목 중 하나 기대.

def ==(other) 
    other.class == self.class && other.date == self.date && other.group == self.group && other.time == self.time 
end 
alias :eql? :== 

을하지만 그건 작동 중 ... 도움이되지 않았다 다음과 같이

나는 클래스 정의에 ==eql? 방법을 추가하는 시도!

답변

2

uniq의 사용이 Instruction의 인스턴스의 두 @date, @group, @time의 가치를 공유 할 수 있습니다 경우에도 있기 때문에 작동하지 않았다, 자신의 정체성이 다릅니다. Instruction 인스턴스 자체가 아닌 이러한 인스턴스 변수의 값을 비교해야합니다.

instructions.uniq{|e| [e.date, e.group, e.time]} 
+0

우수! 고마워요! –

2

hash을 잊어 버렸습니다. eql?은 동일한 hash 값을 가진 객체에만 호출됩니다.