web-dev-qa-db-ja.com

Rubyハッシュを数値でソートする方法は?

カウントでソートしようとしているカウンターハッシュがあります。私が実行している問題は、デフォルトのHash.sort関数が、数値のサイズではなく文字列のように数値をソートすることです。

すなわち、与えられたハッシュ:

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

このコードの実行:

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

ソートされた配列を返します:

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

745は9より大きい数ですが、9がリストの最初に表示されます。誰がトップカウントを持っているかを見せようとするとき、これは私の人生を難しくしています。 :)

ハッシュ(または配列を偶数)を数値のサイズでソートする方法に関するアイデアはありますか?

私は助けに感謝します。

151
Dustin M.

結果が文字列値でソートされないため、どのように結果が得られたのかわかりません...あなたの例ではa1a2を逆にする必要があります

いずれの場合でも(Mladenによる)最善の方法は次のとおりです。

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]]

結果としてハッシュが必要な場合は、to_h(Ruby 2.0+内)を使用できます

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

値は最後のエントリなので、次のことができます。

metrics.sort_by(&:last)
81
shock_one

すでに答えましたが、まだ。コードを次のように変更します。

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

途中で文字列に変換されるかどうかにかかわらず、これは仕事をします。

14
dimitarvp

それは私が見ている動作ではありません:

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]]

あなたの番号が文字列に変換されている線に沿ってどこか可能性はありますか?投稿していないコードはまだありますか?

9
Jacob Mattison