2013-08-14 5 views
6

ハッシュの配列があり、ハッシュ間の一致する値に基づいて一致を見つけて保存する必要があります。Rubyハッシュで重複を検索する

a = [{:id => 1, :name => "Jim", :email => "[email protected]"}, 
    {:id => 2, :name => "Paul", :email => "[email protected]"}, 
    {:id => 3, :name => "Tom", :email => "[email protected]"}, 
    {:id => 1, :name => "Jim", :email => "[email protected]"}, 
    {:id => 5, :name => "Tom", :email => "[email protected]"}, 
    {:id => 6, :name => "Jim", :email => "[email protected]"}] 

だから私は

b = [{:id => 1, :name => "Jim", :email => "[email protected]"}, 
    {:id => 3, :name => "Tom", :email => "[email protected]"}, 
    {:id => 5, :name => "Tom", :email => "[email protected]"}, 
    {:id => 6, :name => "Jim", :email => "[email protected]"}] 

ノートを返すようにしたいでしょう:彼らはうまくだけで、正確で、グループ化する必要はありませんので、私は事実の後:nameによるデータ(CSV)を並べ替えることができます。同じことの2つの必要はありません、それは3または10以上になる可能性があります。

また、データは約22,000行です。

+0

私がしようとしていることは 'uniq! 'の反対ですが、私はそれをどのように処理するかを正確に理解することができませんでした。 – lyonsinbeta

答えて

14

私はこれをテストし、それが正確に何をしたいでしょう:

b = a.group_by { |h| h[:name] }.values.select { |a| a.size > 1 }.flatten 

はしかし、あなたはその計算で生成された中間オブジェクトのいくつかを見て、それらはあなたにもっと役立つかどうかを確認したい場合があります。

+1

私はこれをテストしました。高速応答の軽快さに感謝します。 – lyonsinbeta

+0

余分なクレジットを探していて、非常に疲れた人を幸せにするには、 ':id'が同じインスタンスを削除する必要がある場合はどうすればいいですか?意味は、 ':email'は同じで、':id'は違うところだけを記録します。 – lyonsinbeta

+0

メールであなたは 'name'を意味しますか? 2つのレコードが同じ名前とIDを持つ場合、ハッシュ値は等しくなるはずです。したがって、私は単純に 'a.uniq!'を自分のコードの上に置いてください。あるいは '.group_by'の直前に' .uniq'を挿入することもできます。 –