2013-02-28 13 views
22

Avere un hash:Come ottenere un valore hash da indice numerico

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

posso fare riferimento al valore di hash:

h[:a], h[:c] 

ma vorrei fare riferimento per indice numerico:

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

È possibile?

+3

Attenzione di Ruby versione differenze quando si utilizza 'values': 1.8.x * non * hanno alcun ordinamento, mentre le più Rubino ha inserimento-ordinazione . –

+1

gli hash sono semanticamente non ordinati; se hai bisogno di indicizzazione simile ad array, forse vuoi una diversa struttura dati o una classe che supporti entrambi i meccanismi. – Eevee

+0

@Eevee Tuttavia, hanno un ordine ben definito nella recente versione di Ruby. Ora, se questo dovrebbe essere fatto valere per un algoritmo .. è completamente un'altra domanda. –

risposta

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

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

Si prega di consultare i miei benchmark qui sotto. Usare '[h [h.keys [...]]' è un po 'lento per essere la soluzione migliore. – mudasobwa

+0

La soluzione di @mudasobwa ha anche più senso per me. – Sparhawk

24

h.values ti fornirà un array richiesto.

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

UPD mentre la risposta con h[h.keys[0]] è stata contrassegnata come corretta, io sono un po 'curioso, con parametri di riferimento:

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) 

sembra che stiamo sputare il 10% della produttività.

+0

bella spiegazione :) '+ 1' anche a te. –

+0

Ok .. Grazie per la risposta! –

5

Quindi è necessario sia l'indicizzazione di array che l'indicizzazione di hash?

Se è necessario solo il primo, utilizzare un array.

In caso contrario, è possibile effettuare le seguenti operazioni:

h.values[0] 
h.values[1] 
Problemi correlati