2010-03-01 7 views
0

J'essaie d'insérer une liste dans Hash .. Cependant, hash [key] .size me donne des résultats invalides.hash of Array donne des résultats de taille incorrects - Ruby

p = Hash.new 
p = {"a" => ["b","e"]} 
puts p["a"].size #prints 2 ----This is the Problem 
p["a"] << ["d", "f"] 
puts p["a"].size #prints 3 
puts p["a"][1] #prints e 
puts p["a"][2] #prints df 

Comment, en ajoutant plus de listes incrémenter la taille seulement par un (ce qui est correct). Est-il possible d'initialiser correctement le hachage pour ne pas augmenter la taille à 2.

+0

comment est une taille de 2 en ligne 3 incorrect? p ["a"] est un tableau, avec 2 éléments. que voudriez-vous que la taille soit, et pourquoi? – Pete

+0

Je veux quelque chose comme '{" a "=> [[" b "," e "], [" d "," f "]]}' et la taille à 2. – BSingh

Répondre

5

Édité pour ajouter: Vos commentaires indiquent que vous voulez que l'élément 'a' soit un tableau de tableaux. Ici, il est:

h = Hash.new 
h = {"a" => [["b","e"]]} 
p h       # => {"a"=>[["b", "e"]]} 
h["a"] << ["d", "f"] 
p h       # => {"a"=>[["b", "e"], ["d", "f"]]} 

Lors du diagnostic d'un problème, préfèrent p-puts. puts peut masquer les détails importants. Ajoutons quelques appels au p et voyons ce que nous découvrons. Oh, et je vais changer le nom du hachage de "p" en "h". Sinon, il y a trop de "p" autour.

h = Hash.new 

La ligne ci-dessus est inutile. La ligne suivante assigne un tableau à "h", remplaçant cette assignation.

h = {"a" => ["b","e"]} 
p h # => {"a"=>["b", "e"]} 
p h["a"].size # 2 

Tout est exactement comme il se doit, même h ["a"]. Size return 2. why?

p h["a"] # => ["b", "e"] 

Parce que h ["a"] est un tableau avec deux éléments.

h["a"] << ["d", "f"] 
p h # => {"a"=>["b", "e", ["d", "f"]]} 

Voyez-vous ce qui s'est passé? << ajoute un seul élément à la fin d'un tableau, et cet élément unique est le tableau ["d", "f"]. Et voilà pourquoi:

p h["a"].size # => 3 

Parce qu'il ya en effet trois éléments du tableau: les chaînes « b » et « e », et le tableau [ « d », « f »].

Si vous vouliez ajouter les éléments « d » et « f » au tableau, puis le faire avec +=:

h = {"a" => ["b","e"]} 
h["a"] += ["d", "f"] 
p h # => {"a"=>["b", "e", "d", "f"]} 
+0

Merci Wayne pour votre réponse. Comment puis-je insérer le ["b", "e"] comme un tableau plutôt que comme des éléments individuels. Je veux quelque chose comme '{" a "=> [[" b "," e "], [" d "," f "]]}' – BSingh

+2

@BSingh Alors pourquoi vous ne l'avez pas créé comme 'h = { "a" => [["b", "e"]]} 'et' h ["a"] << ["d", "f"] '? – MBO

+0

@BSingh, j'ai ajouté la suggestion de MBO au début de la réponse. –