2016-07-02 2 views
1

I ein Array mit Hashes mit dem Code unten gefüllt am Reihenfolge:Sortier-Hashes, 4-stellige Zahl verursacht Probleme

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

Als ich Sortierung array[:damagemin] alle Zahlen außer der lone 4-stellige Nummer sortiert werden, die ist wird als sortiert, wenn es eine „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"}]

wie kann ich dieses Problem beheben und die numbe sortieren rs von der höchsten zur niedrigsten unabhängig von ihrer Länge?

Antwort

1

Das Problem ist, dass damagemin sind Strings und Strings Sortierung Algorithmus unterscheidet sich von Zahlen Sortieralgorithmus. Die Sortierung der Strings berücksichtigt nicht die Länge des Worts (erinnern Sie sich an die Reihenfolge der Wörter in einem Wörterbuch).

Zum Beispiel '1234' > '456' => false

Ihr Problem zu lösen, können Sie sagen:

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

Dank @CarySwoveland, verpasste ich diese Zeile. –

+0

Danke, genau, was passieren muss! –

1

Ein anderer Weg:

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

Danke für die Lösung Cary! –

Verwandte Themen