2012-05-22 12 views
6

は、ここで私はルビー:最大値とハッシュペアを取得

 
fruits = {"apples" => 10, "pears" => 15, "bananas" => 15, "grapes" => 12} 

を持っていると私は私がのほとんどを持っていた果物を知りたいどのくらいのそれぞれの果物のを追跡ハッシュです。
タイブレーカーがある場合は、すべてを戻します。

+1

申し訳ありません私は「タイブレーカー」の部分を手に入れませんでした。ハッシュがあなたの例のものであれば、私はそれらのすべてを返すでしょうか? –

+0

@Keikoku、あなたは "すべてを返す"という意味を明確にすることはできますか? WHOLEハッシュを返すことを意味しますか?それとも、最高の価値に結び付けられたキーだけを返すという意味ですか? –

+0

は、トップ値に結びついたものだけを返します。 – MxyL

答えて

8
# easy 
max_quantity = fruits.values.max 
max_fruits = fruits.select { |k, v| v == max_quantity }.keys 

# fast                   
max_quantity = -1.0/0.0 
max_fruits = [] 
fruits.each do |k, v| 
    if v > max_quantity 
    max_quantity = v 
    max_fruits = [] 
    end 
    max_fruits.push k if v == max_quantity 
end 

例外的な場合には、(TM)不良であるので、これらの両方は、常に配列を返します。

+0

選択ブロックが他のブロックよりも遅いですか? – MxyL

+0

私は測定していません。確かに、1つはほとんどネイティブですが、もう1つはRubyなので、実際は間違っているかもしれません:pしかし、上位のものはデータ( "values"、 "max"、 "select"、 "keys"下の方がそれをやるだけです。一番上のものは確かに読みやすく、実際にはスピードの優位性は存在しても無視できます。一番下の例の価値は、実際にあなたがライブラリの助けを借りずに自分でそれをやる方法を学ぶことです。 – Amadan

6
max_value = fruits.values.max 
keys = fruits.select{|k, v| v == max_value}.keys 
+0

「タイブレーカーがある場合はすべて返す」という問題は解決していません。 – Amadan

+0

ああ、私はそれを逃した。 – xdazz

0

(タイブレークを含む)の最高値(S)のハッシュを返すようにRuby's Selectメソッドを使用して短い答え

most_fruit = fruits.select {|x,i| i == fruits.values.max} 

は例:

fruits = {"apples" => 10, "pears" => 15, "bananas" => 15, "grapes" => 12} 
fruits.select {|x,i| i == fruits.values.max } 

出力

{"pears"=>15, "bananas"=>15}

関連する問題