2017-02-16 29 views
-2

オブジェクトの配列内の重複するオブジェクトを削除する方法。 EX用 :オブジェクトの配列内の重複を削除します

[#< @a:1, @b:2>, #< @a:3, @b:3>, #<@a:3, @b:3>] => [ #< @a:1, @b:2>, #< @a:3, @b:3>]. 

また、私の理解は、私が間違っている場合は何の2つのオブジェクトが私same..correctなることはできませんです。

+1

ここであなたが何を求めているのか分かりません。実行することができ、実行しようとしていることを理解できるほど小さな例を作成してみてください。 –

+0

ようこそスタックオーバーフローへ。リンクされたページと "[ask]"と "[mcve]"をお読みください。構文的に間違った配列の定義以上のものを見る必要があると尋ねるとき。私たちはまた、あなたが試したこととそれがなぜうまくいかなかったのかの説明を見る必要があります。現在、あなたが試していないように見えます。あなたにコードを書くように求めているので、努力の証拠が重要です。 http://meta.stackoverflow.com/questions/261592を参照してください。 –

答えて

0

Array#uniqを使用してください。ドキュメントの例:このメソッドは、重複を識別するために、それらのhashまたはeql?方法を使用すること

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

注意。つまり:uniqが期待どおりに機能しない場合は、おそらくhashまたはeql?が適切に実装されていることを確認してください。

3

Array#uniqを使用できますが、クラスを少し変更する必要があります。 the docsの場合、uniqは効率を高めるためにhasheql?メソッドを使用して値を比較するので、クラスの2つのオブジェクトを重複として識別するようにhasheql?を定義する必要があります。あなたがしたくないか、あなたが使用できるhasheql?メソッドを定義することができない場合は、代わりに

class Foo 
    attr_reader :a, :b 

    def initialize(a, b) 
    @a, @b = a, b 
    end 

    def hash 
    [ a, b ].hash 
    end 

    def eql?(other) 
    hash == other.hash 
    end 
end 

arr = [ Foo.new(1, 2), Foo.new(3, 3), Foo.new(3, 3) ] 
p arr.uniq 
# => [#<Foo:0x007f686ac36700 @a=1, @b=2>, #<Foo:0x007f686ac366b0 @a=3, @b=3>] 

:同じ ab属性を持つ2つのオブジェクトが重複している場合たとえば、あなたはこれを行う可能性があります uniqのブロック形式:

class Bar 
    attr_reader :a, :b 

    def initialize(a, b) 
    @a, @b = a, b 
    end 
end 

arr2 = [ Bar.new(1, 2), Bar.new(3, 3), Foo.new(3, 3) ] 

p arr2.uniq {|obj| [ obj.a, obj.b ] } 
# => [#<Bar:0x007fe80f7b6750 @a=1, @b=2>, #<Bar:0x007fe80f7b6700 @a=3, @b=3>] 

あなたはrepl.it.にboth of theseを見ることができます

+0

'Foo#eql?'か 'Foo#hash'が定義されていないと、' arr.uniq#=> arr'と書かれています。その場合は[Object#eql?](http://ruby-doc.org /core-2.3.0/Object.html#method-i-hash)および/または[Object#hash](http://ruby-doc.org/core-2.3.0/Object.html#method-i-hash)ハッシュ)は 'uniq'によって使用されます。 –

関連する問題