2010-03-01 52 views
0

我想在哈希中插入一个列表..但是,哈希[键] .size给我无效的结果。数组散列给出不正确的大小结果 - 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 

如何添加更多列表只增加一个大小(这是正确的)。有没有什么办法可以正确初始化散列 - 不会将大小增加到2.

+0

是如何在3线的大小为2不正确的? p [“a”]是一个包含2个元素的数组。你想要的尺寸是什么,为什么? – Pete 2010-03-01 04:54:38

+0

我想要类似'{“a”=> [[“b”,“e”],[“d”,“f”]]}'并且大小为2. – BSingh 2010-03-01 05:21:56

回答

5

编辑为添加:您的评论表明您希望元素'a'是一个数组数组。那就是:

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

当诊断一个问题,宁愿pputsputs可以隐藏重要的细节。让我们添加几个电话到p,看看我们发现了什么。哦,我会将散列的名称从“p”更改为“h”。否则,周围会出现太多“p”。

h = Hash.new 

上面的行是不必要的。下一行将一个数组赋值给“h”,覆盖这个赋值。

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

一切都与它应该是一样的,甚至h [“a”]。size returns 2. why?

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

因为H [ “一”]是具有两个元件的阵列。

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

您是否看到发生了什么? <<将单个元素附加到数组的末尾,并且该单个元素是数组[[d“,”f“]]。这就是为什么:

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

因为确实在数组中三个元素:字符串“b”和“E”,和数组[“d”,“F”。

如果你的意思是元素“d”和“F”追加到数组,然后用+=做到这一点:

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

感谢Wayne的回复。我怎样才能将[“b”,“e”]作为数组而不是单独的元素插入。我想要类似'{“a”=> [[“b”,“e”],[“d”,“f”]]}' – BSingh 2010-03-01 05:07:09

+2

@BSingh那么为什么你没有像'h = { “a”=> [[“b”,“e”]]}'和'h [“a”] << [“d”,“f”]'? – MBO 2010-03-01 06:57:48

+0

@BSingh,我将MBO的建议添加到答案的顶部。 – 2010-03-02 19:37:24

相关问题