2011-08-12 27 views
5

Tôi đang tìm cách duy trì thứ tự chèn cho Hash mà tôi đang sử dụng trong Ruby. Dữ liệu của tôi đến từ một cơ sở dữ liệu và đã được nhóm/sắp xếp theo cách tôi muốn, nhưng Ruby không đảm bảo duy trì trật tự trong Hashs trong phiên bản 1.8.4 của tôi.Ruby duy trì thứ tự chèn Hash

Có cách giải quyết nào cho vấn đề này không? Nếu không có cách nào tôi có thể tạo một bộ so sánh tùy chỉnh?

Đây là Hash:

{ 
"February"=>[0.5667, 14.6834, 79.7666, 261.8668, 342.1167, 723.517], 
"March"=>[0.0, 26.4667, 554.45, 681.3164, 2376.0668, 10353.0358], 
"May"=>[2.75, 34.6666, 342.1831, 1331.8999, 1589.617, 9282.9662], 
"July"=>[1.9, 2.3666, 59.45, 302.1501, 554.1652, 5195.0839], 
"June"=>[0.15, 24.2166, 244.1498, 335.6834, 536.067, 1498.949], 
"August"=>[0.0, 0.4, 9.3668, 30.7164, 67.7504, 162.0337], 
"April"=>[0.0, 8.3, 68.9331, 357.9168, 815.9662, 2870.217] 
} 

Bất kỳ ý tưởng sẽ là tuyệt vời, Cảm ơn

Trả lời

7

Bạn có thể giữ một danh sách ở phía bên chứa các phím theo thứ tự sắp xếp

ban đầu:

hash = {} 
keys = [] 

khi chèn:

def insert(key, value) 
    keys << key unless hash[key] 
    hash[key] = value 
end 

để lặp để chèn:

for key in keys do 
    puts key, hash[key] 
end 
+0

Nếu tôi lưu danh sách chứa các khóa theo thứ tự được sắp xếp, làm cách nào tôi có thể sử dụng khóa đó để sắp xếp Hash? Bước qua từng cặp và trao đổi trên một sự không phù hợp? –

+0

Đã chỉnh sửa bằng cách làm rõ –

+0

Ồ tôi hiểu, điều đó sẽ hoạt động tốt, Cảm ơn! –

14

của Ruby kể từ phiên bản 1.9 (phát hành tháng 12 năm 2007) duy trì trật tự Hash (xem: http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash/)

Ngoài ra, có một viên ngọc này được gọi là orderedhash cho những viên hồng ngọc cũ.

+0

các công cụ như hash.merge vv sẽ phá vỡ nó, như nhiều hàm băm không overriden, chỉ là một ví dụ nhanh chóng. –

Các vấn đề liên quan