オブジェクトの配列内の重複するオブジェクトを削除する方法。 EX用 :オブジェクトの配列内の重複を削除します
[#< @a:1, @b:2>, #< @a:3, @b:3>, #<@a:3, @b:3>] => [ #< @a:1, @b:2>, #< @a:3, @b:3>].
また、私の理解は、私が間違っている場合は何の2つのオブジェクトが私same..correctなることはできませんです。
オブジェクトの配列内の重複するオブジェクトを削除する方法。 EX用 :オブジェクトの配列内の重複を削除します
[#< @a:1, @b:2>, #< @a:3, @b:3>, #<@a:3, @b:3>] => [ #< @a:1, @b:2>, #< @a:3, @b:3>].
また、私の理解は、私が間違っている場合は何の2つのオブジェクトが私same..correctなることはできませんです。
Array#uniq
を使用してください。ドキュメントの例:このメソッドは、重複を識別するために、それらのhash
またはeql?
方法を使用すること
a = [ "a", "a", "b", "b", "c" ]
a.uniq
# => ["a", "b", "c"]
注意。つまり:uniq
が期待どおりに機能しない場合は、おそらくhash
またはeql?
が適切に実装されていることを確認してください。
Array#uniq
を使用できますが、クラスを少し変更する必要があります。 the docsの場合、uniq
は効率を高めるためにhash
とeql?
メソッドを使用して値を比較するので、クラスの2つのオブジェクトを重複として識別するようにhash
とeql?
を定義する必要があります。あなたがしたくないか、あなたが使用できるhash
とeql?
メソッドを定義することができない場合は、代わりに
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>]
に
:同じa
と
b
属性を持つ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を見ることができます
'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'によって使用されます。 –
ここであなたが何を求めているのか分かりません。実行することができ、実行しようとしていることを理解できるほど小さな例を作成してみてください。 –
ようこそスタックオーバーフローへ。リンクされたページと "[ask]"と "[mcve]"をお読みください。構文的に間違った配列の定義以上のものを見る必要があると尋ねるとき。私たちはまた、あなたが試したこととそれがなぜうまくいかなかったのかの説明を見る必要があります。現在、あなたが試していないように見えます。あなたにコードを書くように求めているので、努力の証拠が重要です。 http://meta.stackoverflow.com/questions/261592を参照してください。 –