2012-03-07 9 views
6

は、私がどのように見えるの配列を持っていると言いますそれらを削除すると言う?Rubyで配列内の重複値を検出するにはどうすればよいですか? - 例えば</p>ことによってIサイクルを行い、かつ重複して何かをどのように <pre><code>a = [cat, dog, cat, mouse, rat, dog, cat] </code></pre> <p>:

言い換えれば、私がa.each do |i|を行った場合、[1]、a [2]、a [3]に対して[0]をどのように評価するのですか?この場合は[2]が最初の重複を持っているとし、それをスタックにプッシュするか、それを削除します。

キーと値の評価方法は知っていますが、同じ配列内で値を評価するにはどうすればよいですか?

ありがとうございました。

答えて

11

を持つ要素を返します。したがって、配列を1回だけ反復処理します。

h = Hash.new(0) 
['a','b','b','c'].each{ |e| h[e] += 1 } 

{"a"=>1, "b"=>2, "c"=>1} 
+1

'h = Hash.new(0)'と 'h [e] + = 1'はどうでしょうか? –

+0

構文の説明。これはプログラマーの裁量に委ねられています。 – ch4nd4n

+0

これは実際に私がやろうとしていたものです....しかし...私は 'nil? 'とインクリメントの方法をこのように使う方法を理解できませんでした。ありがとう! – marcamillion

1

簡単な解決策は、二重ループを実行することです:Array#uniq:あなただけの重複を排除したい場合

a.each_with_index do |a1, idx1| 
    a.each_with_index do |a2, idx2| 
    next if idx1 >= idx2 # Don't compare element to itself 
         # and don't repeat comparisons already made 

    # do something with a pair of elements (a1, a2) 
    end 
end 

を、方法があります。

+0

これについては考えましたが、とても面倒です。より洗練された「ルビー・アイ」のソリューションがありますか? – marcamillion

+0

重複を削除するには、メソッドがあります。すべての要素を互いに比較するために、二重ループがあります。私は個人的にそれに混乱を見ません。それはうまくいく単純なコードです。 –

+0

セルジオこのメソッドは、過去に行われた不要な比較を行っているので非効率です。 2番目の内側のループは、各ループの後で反復を開始する必要があります(つまり、配列内でさらに開始する必要があります)。 – MMM

1

を使用して重複を削除してください。

もチェックアウトruby-doc.orgルビーのクラスメソッドの詳細については、こちらをご覧ください。

+0

compactは配列からnilsを削除します。この状況ではどのように役立ちますか? –

+0

合意。ドキュメントを見て、それは動作しません。 – marcamillion

+0

申し訳ありませんが、私はuniqを書いています。 :) – lesce

3

これを試してみてください:

class Array 
    def find_dups 
     uniq.map {|v| (self - [v]).size < (self.size - 1) ? v : nil}.compact 
    end 
end 

a = ['cat', 'dog', 'cat', 'mouse', 'rat', 'dog', 'cat'] 

print a - a.find_dups # Removes duplicates 

find_dupsあなたは任意の要素が繰り返される回数の店舗番号にハッシュを作成することができ、重複

5

これが効率的に動作し、かなり単純ですが生じるはずである:これは、アレイ内のすべての重複を印刷します

 
array.inject({}){|h, e| h[e] = h[e].to_i + 1; h} 
1

はこれを試してみてください:

array.inject(Hash.new(0)) { |hash,val| 
    hash[val] += 1; 
    hash 
}.each_pair { |val,count| 
    puts "#{val} -> #{count}" if count > 1 
} 
0

require 'set' 

visited = Set.new 
array.each do |element| 
    if visited.include?(element) 
    # duplicated item 
    else 
    # first appearance 
    visited << element 
    end 
end 
0

重複を取り除きたい場合は、最も簡単なのは配列を取り、配列&を配列することです。 &演算子を使用します。

これらの繰り返しが何であるか知りたい場合は、アレイとアレイを比較して&配列を比較してください。

0

配列がソート可能な場合、以下のようなものは重複のみを返します。

array.sort.each_cons(2).select {|p| p[0] == p[1] }.map &:first 

配列をソートし、それを要素の連続するペアにマップし、同じペアを選択して要素にマップします。

0

これを実行する最も良い方法は、それを独自のバージョンと比較することです。同じものが重複していなければ、重複は存在しない。

unique_array = original_array.uniq 

あなたの配列のユニークなバージョンを取得

if original_array == unique_array then return true else return false 

はあなたの元の配列と比較します。

シンプル!

関連する問題

 関連する問題