2016-05-05 2 views
0

私のリストには、私は重複を取り除くにはどうすればよい重複をなくす方法と大きな値を取り除く方法は?

User1, 0

User2, 50

User3, 30

User1, 50

User3, 68

は含まれていますが、最大の取り彼らの価値?これを含める必要が同様

User1, 50User2, 50User3, 68User1, 0を取り除くとUser3, 30

+0

が配列に含まれるこのリストはありますか?ハッシュ? –

+0

このリストは配列に含まれています。 – Charles

+0

そしてペアも配列ですか? ** [[User1,0]、[User2,50] ...] **のように? –

答えて

2

それを行うには多くの方法があります。ここに3つあります。

arr = [[:User1, 0], [:User2, 50], [:User3, 30], [:User1, 50], [:User3, 68]] 

**#1を使用しHash#update **

arr.each_with_object({}) { |(u,x),h| h.update(u=>x) { |_,o,n| [o,n].max } }.to_a 
    #=> [[:User1, 50], [:User2, 50], [:User3, 68]] 

これは、両方のハッシュで存在するキーの値を決定するためにブロックを使用Hash#updateの形態(別名Hash#merge!)({ |_,o,n| [o,n].max }を使用3つのブロック変数の解釈については、docを参照してください。最初の変数(共通キー)はブロック計算には使用されないので、アンダースコア(これは実際にはローカル変数です) 。

#2オーダー(Enumerable#sort_byを使用して)第二の値によって要素および

arr.sort_by(&:last).to_h 
    #=> {:User1=>50, :User3=>68, :User2=>50} 

ハッシュに変換するaを変換する(Array#to_h)を使用する場合まず

a = arr.sort_by(&:last) 
    #=> [[:User1, 0], [:User3, 30], [:User2, 50], [:User1, 50], [:User3, 68]] 

を計算しますハッシュの手順は次のとおりです。

h = {} 
h[:User1] = 0 
h #=> {:User1=>0} 
h[:User3] = 30 
h #=> {:User1=>0, :User3=>30} 
h[:User2] = 50 
h #=> {:User1=>0, :User3=>30, :User2=>50} 
h[:User1] = 50 
h #=> {:User1=>50, :User3=>30, :User2=>50} 
h[:User3] = 68 
h #=> {:User1=>50, :User3=>68, :User2=>50} 

#3を使用Enumerable#group_by

arr.group_by(&:first).map { |k,v| [k, v.map(&:last).max] } 
    #=> [[:User1, 50], [:User2, 50], [:User3, 68]] 

以下のステップがある:ブロックに渡される時間の最初のキーと値のペアについて

h = arr.group_by(&:first) 
    #=> {:User1=>[[:User1, 0], [:User1, 50]], 
    # :User2=>[[:User2, 50]], 
    # :User3=>[[:User3, 30], [:User3, 68]]} 
h.map { |k,v| [k, v.map(&:last).max] } 
    #=> [[:User1, 50], [:User2, 50], [:User3, 68]] 

、我々は:

k,v = [:User1, [[:User1, 0], [:User1, 50]]] 
    #=> [:User1, [[:User1, 0], [:User1, 50]]] 
k #=> :User1 
v #=> [[:User1, 0], [:User1, 50]] 

ブロック計算は、

です。
b = v.map(&:last) 
    #=> [0, 50] 

[k, v.map(&:last).max] 
    #=> [:User1, [0, 50].max] 
    #=> [:User1, 50] 
+0

ありがとう! – Charles

0

あり、これを行うための方法がたくさんありますが、私はおそらくそうのように、配列が列挙から取得group_by方法を使用して起動したい:

users = [[user1,0],[user2,50],[user3,30],[user1,50],[user3,68]] 
user_hash = users.group_by {|user_array| user_array[0]} 

この意志のグループ持っているすべての商品

{ 
user1 => [[user1,0],[user1,50]], 
user2 => [[user2,50]], 
user3 => [[user3,30],[user3,68]] 
} 

そこから、各ユーザーからの最高値を取得選ぶにしたいと思います。彼らの最初の要素に同じ値が、そうuser_hashは、次のような構造を持っているだろう。私はあなたの結果を配列の配列として入力したいと思っていると仮定していますので、Enumerable#mapを使って各ハッシュペアを変換し、Enumerable#max_byで最大のものを選択します第二の要素:

unique_users = user_hash.map do |user,array_of_arrays| 
    array_of_arrays.max_by {|array| array[1]} 
end 

最終結果は、unique_usersは[[user1,50],[user2,50],[user3,68]]

+0

よろしく!ありがとうございました! – Charles

関連する問題