2012-08-28 33 views
6

Quiero obtener valores hash por posición como una matriz.cómo obtener valores hash por posición en ruby?

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

En esta matriz cuando llamamos h [0], devuelve primer elemento de matriz dada.

¿Lo mismo posible en hash? Si es así, ¿cómo?

Gracias en Advance, Prasad.

+1

Hash y Orden no van bien togethr en Ruby, por lo que sería mejor que esté utilizando una matriz en lugar. – oldergod

Respuesta

5

Bueno, la posición es algo que no está muy bien definido en un hash ya que, por definición, es un conjunto desordenado. Aún si se insiste de ser capaz de hacer tal cosa puede convertir el hash a la matriz y luego proceder de la manera que sabe:

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

Usted puede obtener solamente por elementos claves. Hash es una estructura donde no hay orden, como en un conjunto.

+0

No es cierto desde Ruby 1.9.3 – mykola

1

simplemente así:

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

Sin embargo, el orden de los elementos no están definidos, tal vez no están en el orden que le gustaría conseguirlos.

0

Los valores hash solo pueden accederse mediante las teclas explicadas en otras respuestas. La propiedad del índice de matrices no se admite en hashes. Si desea usar un hash ordenado en ruby, puede usar ActiveSupport :: OrderedHash, pero no creo que esté buscando esta característica.

9

Como se mencionó anteriormente, dependiendo de su caso de uso, se puede hacer esto con:

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

Desde Rubí 1.9.1 Hash conserva el orden de inserción. Si necesita compatibilidad con Ruby 1.8, ActiveSupport::OrderedHash es una buena opción.

2

Puede extender Hash para conseguir lo que necesita la siguiente manera (1.9.x rubí):

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 
Cuestiones relacionadas