2013-02-28 9 views
22

Mają hash:Jak uzyskać wartość hash wskaźnikiem numerycznym

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

mogę odnosić się do wartości hash:

h[:a], h[:c] 

ale chciałbym odnieść się poprzez indeksu liczbowego:

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

Czy to możliwe?

+3

Strzeż Ruby różnic wersji przy użyciu 'values': 1.8.x nie * nie * mają żadnego uporządkowania, podczas gdy nowsze Ruby mieć wstawiania-zamawianie . –

+1

hashe są semantycznie nieuporządkowane; jeśli potrzebujesz indeksowania tablicowego, być może potrzebujesz innej struktury danych lub klasy, która obsługuje oba mechanizmy. – Eevee

+0

@Eevee Jednak mają one dobrze zdefiniowaną kolejność w najnowszej wersji Ruby. Teraz, jeśli to powinno polegać na algorytmie ... to zupełnie inne pytanie. –

Odpowiedz

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

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

Proszę zobaczyć moje benchmarki poniżej. Używanie '[h [h.keys [...]]' jest nieco powolne, aby być najlepszym rozwiązaniem. – mudasobwa

+0

Rozwiązanie @mudasobwa ma dla mnie więcej sensu. – Sparhawk

24

h.values da ci żądaną tablicę.

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

UPD natomiast odpowiedź z h[h.keys[0]] został oznaczony jako poprawne, jestem trochę ciekaw z benchmarków:

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) 

Wygląda jakbyśmy plucie na 10% wydajności.

+0

ładne wyjaśnienie :) '+ 1' również. –

+0

Ok .. Dzięki za odpowiedź! –

5

Potrzebujesz indeksowania tablicowego i hashowania?

Jeśli potrzebujesz tylko pierwszego, użyj tablicy.

W przeciwnym razie, można wykonać następujące czynności:

h.values[0] 
h.values[1] 
Powiązane problemy