동일한 객체와 일치하는 객체의 속성을 사용하여 루비 객체의 배열에서 중복 요소를 제거하려면 어떻게해야합니까?중복 객체가 Ruby 객체의 배열에 추가되지 않도록 하시겠습니까?
기본 유형 배열을 사용할 수 있습니다.
예 :
array_list = [1, 3, 4 5, 6, 6]
array_list.to_set
=> [1, 2, 3, 4, 5, 6]
이 기술을 객체 속성으로 작업 할 수 있습니까?
감사
동일한 객체와 일치하는 객체의 속성을 사용하여 루비 객체의 배열에서 중복 요소를 제거하려면 어떻게해야합니까?중복 객체가 Ruby 객체의 배열에 추가되지 않도록 하시겠습니까?
기본 유형 배열을 사용할 수 있습니다.
예 :
array_list = [1, 3, 4 5, 6, 6]
array_list.to_set
=> [1, 2, 3, 4, 5, 6]
이 기술을 객체 속성으로 작업 할 수 있습니까?
감사
eql?
을 사용하여 개체에 쓸 수있는 경우 uniq
을 사용할 수 있습니다. 당신의 응답을
덕분에 .. UNIQ 한 번 나는 내 개체 모델
def ==(other)
other.class == self.class &&
other.id == self.id
end
alias :eql? :==
이것은'Object # hash'의 계약과'Object # =='의 계약에 위배됩니다. –
난 당신이 말을하기 전에 카트를 가하고 있습니다 생각에 다음을 추가 작품. 당신은 자신에게 묻습니다 : "어떻게 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
Jörg, 'use. type_number'를 사용하여 내 제품을 고유 한 용도로만 사용하려면 다른 필드를 사용하십시오 (예 : 다른 용도로'color')? 이상적으로, 정렬에 사용되는 비교 방법에 공통적 인 것처럼 블록을 사용할 수 있으면 좋을 것입니다. 어떤 아이디어? –
안녕하세요. 이상 적으로 객체가 배열에 추가되는 것을 막기를 원합니다 (일치하는 속성을 기반으로). 나는 세트가 이것을 할 수도 있다고 생각했다. – Dom
당신이 Array
를 사용 하는가를하거나 대신 Set
를 사용 하는가? 순서가 중요하지 않은 경우, 후자는 중복을 확인하는 것이 더 효율적이됩니다.
참조 http://stackoverflow.com/questions/109781/uniq-by-object-attribute-in-ruby/113770#113770 – steenslag