count
と定義された というハッシュがありcount = {4=>2, 5=>3, 6=>3, 7=>1}
ます。
max
値を取得し、その値に対応するキーを配列にプッシュしたいので、次のようにします。
array = []
array.push(count.max_by{|k,v| v}[0])
=>> [5]
ただし、別の最大値である6
値もあります。この値を配列にプッシュして、代わり3
に取得するにはどうすればよいですか?[5,6]
[5]
count
と定義された というハッシュがありcount = {4=>2, 5=>3, 6=>3, 7=>1}
ます。
max
値を取得し、その値に対応するキーを配列にプッシュしたいので、次のようにします。
array = []
array.push(count.max_by{|k,v| v}[0])
=>> [5]
ただし、別の最大値である6
値もあります。この値を配列にプッシュして、代わり3
に取得するにはどうすればよいですか?[5,6]
[5]
これはmax
、ハッシュの値を選択する方法です。
count.values.max
=> 3
select
ハッシュでメソッドを使用します。
count.select{ |k, v| v == count.values.max }
=> {5=>3, 6=>3}
キーを取得します。
count.select{ |k, v| v == count.values.max }.keys
=> [5, 6]
最後に配列に割り当てます。
array = count.select{ |k, v| v == count.values.max }.keys
これはおそらく劇的に改善される可能性がありますが、私の頭の上から:
count.group_by{|k,v| v}.max_by{|k,v| k}.last.map(&:first)
まず、ハッシュのキーと値のペアをグループ化して、同じ値を持つものが同じグループに属するようにします。
count.group_by{|k,v| v} #=> {2=>[[4, 2]], 3=>[[5, 3], [6, 3]], 1=>[[7, 1]]}
次に、最大値を持つグループを取得します。
.max_by{|k,v| k} #=> [3, [[5, 3], [6, 3]]]
ここで、そこから元のキーが必要なだけなので、最初にペアの最後の要素を取得します。
.last #=> [[5, 3], [6, 3]]
そして、ネストされた各ペアの最初の要素だけが必要です。
.map(&:first) #=> [5, 6]
select
このアプローチは、 に基づくソリューションと比較して、マップを 1 回通過する必要がありません。データセットが非常に巨大でない限り、おそらくパフォーマンスが大幅に向上することはありません。その場合、私のソリューションによって構築されている中間データ構造がとにかく問題になります。
max = count.values.max
array = count.keys.select{|k| count[k] == max}