2012-03-21 265 views
3

如何散列散列散列?散列散列的紅寶石散列

我測試返回

未定義的方法`[]」爲零:NilClass(NoMethodError)

任何提示嗎?

found = Hash.new() 
x = 1; 

while x < 4 do 
    found[x] = Hash.new() 
    y = 1 

    while y < 4 do 
    found[x][y] = Hash.new() 
    found[x][y]['name1'] = 'abc1' 
    found[x][y]['name2'] = 'abc2' 
    found[x][y]['name3'] = 'abc3' 

    y += 1 
    end 

    x += 1 
end 

found.each do |k, v, y| 
    puts "k : #{k}" 
    puts " : #{v[y['name1']]}" 
    puts " : #{v[y['name2']]}" 
    puts " : #{v[y['name3']]}" 
    puts 
end 
+1

爲什麼你使用'Hash.new()',而不是僅僅'{}'? – 2012-03-21 17:10:12

+0

@NiklasB。也許OP會將附加參數傳遞給'Hash#new',併發布簡化的代碼片段 – galymzhan 2012-03-21 17:16:56

+0

@galymzhan:我很懷疑,看到他手動初始化默認值後。 – 2012-03-21 17:19:02

回答

2

我想你想是這樣的:

首先創建數據結構。您需要嵌套散列,因此您需要爲每個散列鍵定義默認值。

found = Hash.new do |hash,key| 
    hash[key] = Hash.new do |hash,key| 
     hash[key] = Hash.new 
    end 
end 

運行搜索

(1..3).each do |x| 
    (1..3).each do |y| 
    found[x][y]['name1'] = 'abc1' 
    found[x][y]['name2'] = 'abc1' 
    found[x][y]['name3'] = 'abc1'  
    end 
end 

然後顯示結果

found.each do |x, y_hash| 
    y_hash.each do |y, name_hash| 
    name_hash.each do |name, value| 
     puts "#{x} => #{y} => #{name} => #{value}" 
    end 
    end 
end 
+1

散列不會很好地解構成'(v,y)'。 – 2012-03-21 17:18:09

+0

是的,意識到我發佈後,現在編輯 – opsb 2012-03-21 17:27:33

2

您構建hash的方式似乎是功能性的。什麼可能會導致該錯誤是這樣的循環:

found.each do |k, v, y| 

Hash#each產生鍵/值對,所以y將被分配nil,從而導致以下兩行的錯誤。你大概的意思是像

found.each do |x, h1| 
    h1.each do |y, h2| 
    puts h2['name1'] 
    end 
end 

嵌套循環你也應該知道,在Ruby中的計數循環更簡潔,你可以寫這些類型:

found = Hash.new { |h,k| h[k] = {} } 

1.upto(3) do |x| 
    1.upto(3) do |y| 
    found[x][y] = { 
     'name1' => 'abc1', 
     'name2' => 'abc2', 
     'name3' => 'abc3', 
    } 
    end 
end