it-swarm.com.de

Wie sortiere ich einen Ruby Hash nach Zahlenwert?

Ich habe einen Zähler-Hash, den ich nach Anzahl sortieren möchte. Das Problem, auf das ich stoße, ist, dass die standardmäßige Hash.sort-Funktion Zahlen wie Zeichenfolgen anstatt nach der Zahlengröße sortiert.

d.h. gegebener Hash:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }

Diesen Code ausführen:

metrics.sort {|a1,a2| a2[1]<=>a1[1]}

gibt ein sortiertes Array zurück:

[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]

Obwohl 745 eine größere Zahl als 9 ist, wird 9 zuerst in der Liste angezeigt. Wenn ich versuche zu zeigen, wer die höchste Punktzahl hat, macht mir das das Leben schwer. :)

Irgendwelche Ideen, wie ein Hash (oder sogar ein Array) nach Zahlenwertgröße sortiert werden kann?

Ich freue mich über jede Hilfe.

151
Dustin M.

Keine Ahnung, wie Sie zu Ihren Ergebnissen gekommen sind, da die Sortierung nicht nach Zeichenfolgenwert erfolgt ... Sie sollten in Ihrem Beispiel a1 Und a2 Umkehren

Der beste Weg in jedem Fall (nach Mladen) ist:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
metrics.sort_by {|_key, value| value}
  # ==> [["siteb.com", 9], ["sitec.com", 10], ["sitea.com", 745]]

Wenn Sie als Ergebnis einen Hash benötigen, können Sie to_h Verwenden (in Ruby 2.0+)

metrics.sort_by {|_key, value| value}.to_h
  # ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}
260

Da value der letzte Eintrag ist, können Sie Folgendes tun:

metrics.sort_by(&:last)
81
shock_one

Bereits beantwortet, aber immer noch. Ändern Sie Ihren Code in:

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }

Auf dem Weg in Zeichenfolgen umgewandelt oder nicht, dies wird den Job erledigen.

14
dimitarvp

Das ist nicht das Verhalten, das ich sehe:

irb(main):001:0> metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" =>
 10 }
=> {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745}
irb(main):002:0> metrics.sort {|a1,a2| a2[1]<=>a1[1]}
=> [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]]

Ist es möglich, dass irgendwo entlang der Linie Ihre Zahlen in Zeichenfolgen konvertiert werden? Gibt es mehr Code, den Sie nicht veröffentlichen?

9
Jacob Mattison