Ruby更新哈希的哈希奇怪行为

时间:2014-07-15 15:28:52

标签: ruby hash

我创建了一个哈希哈希值,其中一天中的小时是id =>哈希的哈希的关键。零。

例如:

{0=>{1=>0, 2=>0, 3=>0, 4=>0}, 1=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    2=>{1=>0, 2=>0, 3=>0, 4=>0}, 3=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    4=>{1=>0, 2=>0, 3=>0, 4=>0}, 5=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    6=>{1=>0, 2=>0, 3=>0, 4=>0}, 7=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    8=>{1=>0, 2=>0, 3=>0, 4=>0}, 9=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    10=>{1=>0, 2=>0, 3=>0, 4=>0}, 11=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    12=>{1=>0, 2=>0, 3=>0, 4=>0}, 13=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    14=>{1=>0, 2=>0, 3=>0, 4=>0}, 15=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    16=>{1=>0, 2=>0, 3=>0, 4=>0}, 17=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    18=>{1=>0, 2=>0, 3=>0, 4=>0}, 19=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    20=>{1=>0, 2=>0, 3=>0, 4=>0}, 21=>{1=>0, 2=>0, 3=>0, 4=>0}, 
    22=>{1=>0, 2=>0, 3=>0, 4=>0},  23=>{1=>0, 2=>0, 3=>0, 4=>0}}

我使用此代码创建它们:

hour_hash = {}
count = (1..4).inject({}) {|m,e| m[e]=0;m}
(0..23).each do |i|
    hour_hash[i]=count
end

当我尝试更新其中一个哈希中的元素时,如下所示:

hour_hash[0][3] += 1

整个哈希得到更新:

{0=>{1=>0, 2=>0, 3=>1, 4=>0}, 1=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 2=>{1=>0, 2=>0, 3=>1, 4=>0}, 3=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 4=>{1=>0, 2=>0, 3=>1, 4=>0}, 5=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 6=>{1=>0, 2=>0, 3=>1, 4=>0}, 7=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 8=>{1=>0, 2=>0, 3=>1, 4=>0}, 9=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 10=>{1=>0, 2=>0, 3=>1, 4=>0}, 11=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 12=>{1=>0, 2=>0, 3=>1, 4=>0}, 13=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 14=>{1=>0, 2=>0, 3=>1, 4=>0}, 15=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 16=>{1=>0, 2=>0, 3=>1, 4=>0}, 17=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 18=>{1=>0, 2=>0, 3=>1, 4=>0}, 19=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 20=>{1=>0, 2=>0, 3=>1, 4=>0}, 21=>{1=>0, 2=>0, 3=>1, 4=>0}, 
 22=>{1=>0, 2=>0, 3=>1, 4=>0}, 23=>{1=>0, 2=>0, 3=>1, 4=>0}}

有人可以开导我吗?我应该能够访问哈希中的单个元素,比如hash [x] [y],对吗?非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

hour_hash = (0..23).each_with_object({}) do |i, h|
  h[i] = (1..4).each_with_object({}){|j, h| h[j] = 0}
end

hour_hash[0][3] += 1

hour_hash # =>
  

{0 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 1,4 =&gt; 0},1 =&gt; {1 =&gt; 0 =&gt; 0 ,3 =&gt; 0,4 =&gt; 0},2 =&gt; {1 =&gt; 0 =&gt; 0,3 =&gt; 0,4 =&gt; 0},3 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},4 =&gt; {1 => 0,2 =&gt; 0,3 =&gt; 0,4&gt; ; 0},5 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},6 =&gt; {1 =&gt; 0 =&gt; 0 ,3 =&gt; 0,4 =&gt; 0},7 =&gt; {1 =&gt; 0 =&gt; 0,3 =&gt; 0,4 =&gt; 0},8 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},9 =&gt; {1 => 0,2 =&gt; 0,3 =&gt; 0,4&gt; ; 0},10 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},11 =&gt; {1 =&gt; 0 =&gt; 0 ,3 =&gt; 0,4 =&gt; 0},12 =&gt; {1 =&gt; 0 =&gt; 0,3 =&gt; 0,4 =&gt; 0},13 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},14 =&gt; {1 => 0,2 =&gt; 0,3 =&gt; 0,4&gt; ; 0},15 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},16 =&gt; {1 =&gt; 0 =&gt; 0 ,3 =&gt; 0,4 =&gt; 0},17 =&gt; {1 =&gt; 0 =&gt; 0,3 =&gt; 0,4 =&gt; 0},18 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},19 =&gt; {1 => 0,2 =&gt; 0,3 =&gt; 0,4&gt; ; 0},20 =&gt; {1 =&gt; 0,2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},21 =&gt; {1 =&gt; 0,2 =&gt; 0 ,3 =&gt; 0,4 =&gt; 0},22 =&gt; {1 =&gt; 0, 2 =&gt; 0,3 =&gt; 0,4 =&gt; 0},23 =&gt; {1 =&gt; 0 =&gt; 0,3 =&gt; 0,4 =&gt; 0}} < / p>

答案 1 :(得分:1)

我认为你可以在这里使用Hash的默认值块:

hour_hash = Hash.new {|h, k| h[k] = {1=>0, 2=>0, 3=>0, 4=>0 } }

如果您只需要查找值,就可以在这里停下来。如果你需要&#34;空&#34;您可以添加0..23的值:

(0..23).each {|x| hour_hash[x] }

并使用它:

hour_hash[0][3] += 1