2016-07-02 11 views
1
Iは、以下のコード使用してハッシュを充填したアレイソーティングい

ソート、ハッシュ、4桁の数字引き起こす問題

array.sort_by {|hash| hash[:key_name]} 

Iソートarray[:damagemin]全ての数字である唯一の4桁の数字を除いてソートされそれが「1」であるかのようにソートされている:

array 
 
=> [{:heroname=>"Bastion", :winrate=>"53.6%", :damagemin=>"1079", :herokd=>"2.23:1"}, 
 
{:heroname=>"Lúcio", :winrate=>"57.6%", :damagemin=>"328", :herokd=>"1.51:1"}, 
 
{:heroname=>"Mei", :winrate=>"51%", :damagemin=>"451", :herokd=>"1.95:1"}, 
 
{:heroname=>"Reinhardt", :winrate=>"51.3%", :damagemin=>"463", :herokd=>"1.28:1"}]

どのように私はこの問題を解決し、numbeを並べ替えることができます長さに関係なく、最高から最低までのrs?

答えて

1

問題はdamageminが文字列で、文字列のソートアルゴリズムが数字ソートアルゴリズムと異なることです。文字列ソートでは、単語の長さは考慮されません(辞書内の単語の順序を覚えておいてください)。例えば

'1234' > '456' => false

あなたの問題を解決するために、あなたが言うことができます。

array.sort_by { |hash| -hash[:damagemin].to_i } 
+0

おかげで@CarySwoveland、私はそのラインを逃しました。 –

+0

ありがとう、何が起こる必要があります! –

1

別の方法:

array = [ 
     { :heroname=>"Bastion", :winrate=>"53.6%", :damagemin=>"1079", 
      :herokd=>"2.23:1" }, 
     { :heroname=>"Lúcio", :winrate=>"57.6%", :damagemin=>"328", 
      :herokd=>"1.51:1" }, 
     { :heroname=>"Mei", :winrate=>"51%", :damagemin=>"451", 
      :herokd=>"1.95:1" }, 
     { :heroname=>"Reinhardt", :winrate=>"51.3%", :damagemin=>"463", 
      :herokd=>"1.28:1"} 
     ] 

array.sort { |g,h| h[:damagemin].to_i <=> g[:damagemin].to_i } 
    #=> [{ :heroname=>"Bastion", :winrate=>"53.6%", :damagemin=>"1079", 
    #  :herokd=>"2.23:1"}, 
    # { :heroname=>"Reinhardt", :winrate=>"51.3%", :damagemin=>"463", 
    #  :herokd=>"1.28:1"}, 
    # { :heroname=>"Mei", :winrate=>"51%", :damagemin=>"451", 
    #  :herokd=>"1.95:1"}, 
    # { :heroname=>"Lúcio", :winrate=>"57.6%", :damagemin=>"328", 
    #  :herokd=>"1.51:1"} 
    # ] 
+0

ソリューションありがとうございましたCary! –

関連する問題