2010-09-29 3 views
3

Comment passer la gamme dans le hachage pour itérer de l'index 1 à la dernière?Iterate hachage pour la plage spécifique

h = {} 

h[1..-1].each_pair do |key,value| 
    puts "#{key} = #{value} 
end 

Ce code renvoyant une erreur. comment puis-je passer la gamme en hash ??

EDIT:

Je veux imprimer la première clé et valeur sans aucun calcul. À partir de la deuxième clé et de la valeur, je veux faire un calcul sur mon hachage.

Pour cela, j'ai écrit ce code ... store_content_in_hash contenant la clé et les valeurs.

first_key_value = store_content_in_hash.shift 
f.puts first_key_value[1] 
f.puts 
store_content_in_hash.each_pair do |key,value| 
    store_content_in_hash[key].sort.each {|v| f.puts v } 
    f.puts 
end 

Une meilleure façon de résoudre ce problème?

+0

Qu'essayez-vous de faire? Vous pouvez juste besoin d'un algorithme qui va générer une valeur de hachage (c'est une fonction mathématique) qui a une certaine valeur. Ainsi, pour une chaîne, vous pouvez additionner toutes les valeurs ASCII * dans la chaîne% premier nombre par exemple. –

Répondre

7

Dans Ruby 1.9 seulement:

Étant donné un hachage:

h = { :a => :b, :c => :d, :e => :f } 

Go Comme ceci:

Hash[Array(h)[1..-1]].each_pair do |key, value| 
    # ... 
end 

Cela itérer le hachage suivant { :c => :d, :e => f } comme la première paire clé/valeur est exclu par la gamme.

2

Les hachages n'ont aucun concept de commande. Il n'existe pas de premier ou deuxième élément dans un hachage.

Donc, vous ne pouvez pas faire ce que vous voulez avec des hachages.

0

Le hachage ne concerne pas les gammes. Il s'agit de paires de valeurs clés. Dans ruby ​​1.8 hash n'est pas ordonné donc vous ne pouvez pas être sûr dans quel ordre les clés et les valeurs seront itérées sur ce qui rend obsolète "range" chose. Et je crois que vous faites quelque chose de mal (tm) dans cette situation. Pouvez-vous élaborer sur votre problème? Sur l'autre note, vous obtenez une erreur car les crochets dans l'instance Hash acceptent les clés. Donc, si votre hash ne contient pas 1..-1 comme une clé - vous obtiendrez une valeur nulle et ne répond pas à each_pair. Essayez ceci pour obtenir une prise sur ceci:

h = {(1..-1) => {:foo => :bar}} 

h[1..-1].each_pair do |key,value| 
    puts "#{key} = #{value}" 
end 
0

Comme d'autres l'ont fait remarquer, les hachages ne sont pas sur l'ordre. Il est vrai que 1.9 hachages sont commandés, mais c'est juste une commodité, pas leur caractéristique principale.

Si la commande est importante pour vous, utilisez simplement des tableaux au lieu des hachages. Dans votre cas, un tableau de paires (tableaux à deux éléments) semble correspondre à l'objectif. Et si vous avez besoin d'y accéder par clé, vous pouvez toujours facilement le convertir en hash en utilisant la méthode Hash#[].

Questions connexes