ハッシュの配列をハッシュの値でソートするにはどうすればよいですか?


119

このRubyコードは私が期待するように動作していません:

# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})

# sort
sort_me.sort_by { |k| k["value"]}

# same order as above!
puts sort_me

ハッシュの配列をキー「値」でソートしようとしていますが、ソートされずに出力されます。

回答:


214

Ruby sortはインプレースでソートされません。(おそらくPythonのバックグラウンドはありますか?)

Rubyにはsort!インプレースソート機能がありますがsort_by、Ruby 1.8にはインプレースバリアントはありません。実際には、次のことができます。

sorted = sort_me.sort_by { |k| k["value"] }
puts sorted

Ruby 1.9以降で.sort_by!は、インプレースソートに使用できます。

sort_me.sort_by! { |k| k["value"]}

28
実際、Array#sort_by!Ruby 1.9.2の新機能です。利用可能な今日の私の要求することにより、すべてのRubyのバージョンにbackportsすぎ宝石を:-)
マルク=アンドレ・Lafortune

こんにちは、降順で並べ替える方法もありますか?私は行きたいかもしれないと思い3,2,1ます...
tekknolagi

2
あなたがそれを行うことはできませんsort_byが、使用は、sortまたはsort!単にオペランドを反転:a.sort! {|x,y| y <=> x }ruby-doc.org/core-1.9.3/Array.html#method-i-sort
ステファンKochen

1
または:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz

9
@tekknolagi:を追加するだけ.reverseです。
Zaz

21

@shteefと同様ですがsort!、推奨されるバリアントで実装されています。

sort_me.sort! { |x, y| x["value"] <=> y["value"] }

7

Rubyにはsort_byインプレースバリアントはありませんが、次のことができます。

sort_me = sort_me.sort_by { |k| k["value"] }

Array.sort_by! 1.9.2で追加されました


1
この「Array.sort_by!は1.9.2で追加されました」という回答がうまく
いき

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.