ฉันจะจัดเรียงอาร์เรย์ของแฮชตามค่าในแฮชได้อย่างไร


121

รหัส 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

ฉันต้องการจัดเรียงอาร์เรย์ของแฮชตามคีย์ "ค่า" แต่ถูกพิมพ์โดยไม่เรียงลำดับ

คำตอบ:


216

ทับทิม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อัญมณีของฉันด้วย :-)
Marc-André 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 )
Stéphan 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" นี้ใช้ได้ผลสำหรับฉัน
web spider26

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.