2017-05-12 5 views
-1

私はこれを持っている:この配列をルビでどのように並べ替えることができますか?

list = [[apple, John], [apple, Paul], [banana, Paul]] 

はこのようになり:

list = [[apple, [John, Paul]], [banana, [Paul]] 

私は、各素子の周波数を知っているとに応じて、それらを並べ替える必要があるため、この問題を解決する方法がわかりませんEnumberable#each_with_object、AGGを使用して全リスト...

+1

あなたのデータ構造は有効なRubyデータ構造ではありません。また、何を試しましたか? [so]は、コードを書くのではなく、書くコードの問題を解決するのに役立ちます。コーナーケースや例外を含む、望ましい入力と出力の仕様を[mcve]で指定してください。コーナーケースを示すものを含め、有効な入力と望ましい出力の例を挙げてください。多分、[ヘルプ/トピック]を読んで、[尋ねる]を見て、[ツアー]を見て[メタ]を見てください。 –

+1

ハッシュを使用することができます。 –

答えて

2
list.group_by(&:first).map { |fruit, preferences| [fruit, preferences.map(&:last)] } 
+0

ありがとうございます!ニースコード! –

1
list = [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]] 
=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]] 

ハッシュのキーに基づいてすべての値を調整し、次に配列に変換する。

list.each_with_object(Hash.new{[]}) { |x, h| h[x.first] <<= x.last }.to_a 
=> [["apple", ["John", "Paul"]], ["banana", ["Paul"]]] 
0

もう1つの方法。

list = [%w|apple John|, %w|apple Paul|, %w|banana Paul|] 
    #=> [["apple", "John"], ["apple", "Paul"], ["banana", "Paul"]] 

list.each_with_object({}) { |(fruit,name),h| h.update(fruit=>[name]) { |_k,o,n| o+n } } 
    #=> {"apple"=>["John", "Paul"], "banana"=>["Paul"]} 

これは、マージされ、両方のハッシュに存在するキーの値を決定するためにブロック({ |_k,o,n| o+n })を使用(別名merge!Hash#updateの形態を使用します。 3つのブロック変数の定義については、_k,oおよびnのドキュメントを参照してください。アンダースコアは、ブロック計算に_k(たいていは_と書かれている)が使用されていないことを読者に示します。

関連する問題