2012-08-28 21 views
6

Voglio ottenere i valori hash posizionandoli come una matrice.come ottenere i valori hash dalla posizione in ruby?

Esempio: h = Hash["a" => 100, "b" => 200]

In questa matrice quando chiamiamo h [0], esso restituisce primo elemento dato array.

Quella stessa cosa possibile in hash? Se lo è, allora come?

Grazie in anticipo, Prasad.

+1

Hash and Order non vanno bene togethr in Ruby, così si sarebbe meglio utilizzare una matrice invece. – oldergod

risposta

5

Bene, la posizione è qualcosa che non è molto ben definito in un hash come per definizione è un insieme non ordinato. Ancora se si insiste di essere in grado di fare una cosa del genere è possibile convertire l'hash di array e quindi procedere nel modo che conosce:

irb(main):001:0> h = {:a => 1, :b => 2} 
=> {:b=>2, :a=>1} 
irb(main):002:0> h.to_a 
=> [[:b, 2], [:a, 1]] 
0

È possibile ottenere elementi solo con le chiavi. Hash è una struttura in cui non esiste un ordine, come in un set.

+0

Non vero da quando Ruby 1.9.3 – mykola

1

Semplicemente così:

h.values[0] 
# or 
h.keys[0] 

Ma l'ordine degli elementi non sono definiti, forse non sono nell'ordine in cui si desidera ottenere loro.

0

I valori di hash possono essere raggiunti solo tramite i tasti, come spiegato in altre risposte. La proprietà index degli array non è supportata negli hash. Se si desidera utilizzare un hash ordinato in ruby, è possibile utilizzare ActiveSupport :: OrderedHash, ma non penso che si stia cercando questa funzionalità.

9

Come accennato in precedenza, a seconda del caso d'uso, si può fare questo con:

h.keys[0] 
    h.values[0] 
    h.to_a[0] 

Da Ruby 1.9.1 Hash conserva l'ordine di inserimento. Se hai bisogno della compatibilità con Ruby 1.8 ActiveSupport::OrderedHash è una buona opzione.

2

È possibile estendere Hash per ottenere quello che ti serve segue (rubino 1.9.x):

class Hash 
    def last    # first is already defined 
    idx = self.keys.last 
    [idx , self[idx]] 
    end 
    def array_index_of(n) # returns nth data 
    idx = self.keys[n] 
    self[idx] 
    end 
end 

h = {"a" => 100, "b" => 200} 
h.first # ["a", 100] 
h.last # ["b", 200] 

h.array_index_of(0) # => 100 
h.array_index_of(1) # => 200