2013-02-28 37 views
22

Có một băm:Làm thế nào để có được một giá trị băm của chỉ số số

h = {:a => "val1", :b => "val2", :c => "val3"} 

tôi có thể tham khảo các giá trị băm:

h[:a], h[:c] 

nhưng tôi muốn tham khảo bởi chỉ số số:

h[0] => val1 
h[2] => val3 

Có thể không?

+3

Cảnh giác với những sự khác biệt phiên bản Ruby khi sử dụng 'values': 1.8.x nào * không * có bất kỳ trật tự, trong khi phiên bản mới hơn Ruby có chèn đặt hàng . –

+1

băm không theo thứ tự ngữ nghĩa; nếu bạn cần lập chỉ mục giống như mảng, có lẽ bạn muốn cấu trúc dữ liệu khác nhau hoặc một lớp hỗ trợ cả hai cơ chế. – Eevee

+0

@Eevee Tuy nhiên, họ có một thứ tự được xác định rõ ràng trong phiên bản Ruby gần đây. Bây giờ, nếu điều này nên được dựa vào cho một thuật toán .. là một câu hỏi hoàn toàn. –

Trả lời

23
h = {:a => "val1", :b => "val2", :c => "val3"} 
keys = h.keys 

h[keys[0]] # "val1" 
h[keys[2]] # "val3" 
+0

Vui lòng xem điểm chuẩn của tôi bên dưới. Sử dụng '[h [h.keys […]]' hơi chậm để trở thành giải pháp tốt nhất. – mudasobwa

+0

@mudasobwa của giải pháp cũng có ý nghĩa hơn với tôi. – Sparhawk

24

h.values sẽ cung cấp cho bạn một mảng được yêu cầu.

> h.values 
# ⇒ [ 
# [0] "val1", 
# [1] "val2", 
# [2] "val3" 
# ] 

UPD trong khi câu trả lời với h[h.keys[0]] được đánh dấu là đúng, tôi là một chút tò mò với các tiêu chuẩn:

h = {:a => "val1", :b => "val2", :c => "val3"} 
Benchmark.bm do |x| 
    x.report { 1_000_000.times { h[h.keys[0]] = 'ghgh'} } 
    x.report { 1_000_000.times { h.values[0] = 'ghgh'} } 
end 

# 
#  user  system  total  real 
# 0.920000 0.000000 0.920000 ( 0.922456) 
# 0.820000 0.000000 0.820000 ( 0.824592) 

Hình như chúng ta đang nhổ nước miếng lên 10% năng suất.

+0

giải thích tốt đẹp :) '+ 1' cho bạn cũng vậy. –

+0

Ok .. Cảm ơn bạn đã trả lời! –

5

Vì vậy, bạn cần cả lập chỉ mục mảng và lập chỉ mục băm?

Nếu bạn chỉ cần cái đầu tiên, hãy sử dụng một mảng.

Nếu không, bạn có thể làm như sau:

h.values[0] 
h.values[1] 
Các vấn đề liên quan