Làm cách nào để sắp xếp một mảng băm theo một giá trị trong hàm băm?


120

Mã Ruby này không hoạt động như tôi mong đợi:

# 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

Tôi đang tìm cách sắp xếp mảng băm theo khóa "giá trị", nhưng chúng được in không được sắp xếp.

Câu trả lời:


215

Ruby sortkhông sắp xếp tại chỗ. (Bạn có nền tảng Python không?)

Ruby có sort!để sắp xếp tại chỗ, nhưng không có biến thể sort_bytại chỗ cho Ruby 1.8. Trong thực tế, bạn có thể làm:

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

Kể từ Ruby 1.9+, .sort_by!có sẵn để phân loại tại chỗ:

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

28
Trên thực tế, Array#sort_by!là một tính năng mới trong Ruby 1.9.2. Hiện nay cho tất cả các phiên bản Ruby bằng cách yêu cầu của tôi backportsviên ngọc quá :-)
Marc-André Lafortune

Chào bạn, có cách nào để sắp xếp theo thứ tự giảm dần không? Tôi hình dung tôi có thể muốn đi 3,2,1...
tekknolagi

2
Bạn không thể làm điều đó với sort_by, nhưng việc sử dụng sorthay sort!và đơn giản lật toán hạng: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen

1
Hoặc:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz

9
@tekknolagi: Chỉ cần nối thêm .reverse.
Zaz

21

Theo @shteef nhưng được triển khai với sort!biến thể như được đề xuất:

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

7

Mặc dù Ruby không có sort_bybiến thể tại chỗ, nhưng bạn có thể làm:

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

Array.sort_by! đã được thêm vào 1.9.2


1
Câu trả lời "Array.sort_by! Đã được thêm vào 1.9.2" này phù hợp với tôi
web spider 26

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.