2014-11-14 40 views
0

我想創建一個數組,其中每個條目應該是一個單獨的,相同的哈希條目在開始。創建一個數組填充單獨的哈希

iTabSize = 500 #protein max lenght 
arrTable = Array.new(iTabSize) 
hshTable = {"-"=>0,"B"=>0,"Z"=>0,"I"=>0,"M"=>0,"T"=>0,"N"=>0,"K"=>0,"S"=>0,"R"=>0,"V"=>0,"A"=>0,"D"=>0,"E"=>0,"G"=>0,"F"=>0,"L"=>0,"Y"=>0,"X"=>0,"C"=>0,"W"=>0,"P"=>0,"H"=>0,"Q"=>0} 
0.upto(iTabSize){|x| arrTable[x]= hshTable} 

的問題是如果我改變散列在陣列中的一個條目中,哈希獲取所有其他條目更新:/

arrTable[x][strSeq[x]] = arrTable[x][strSeq[x]] + 1 

strSeq是包含從散列字母序列。 結果是arrTable中的每個x都包含完全相同的值?

我用哈希創建數組時做錯了什麼?

我試着用

arrTable = Array.new {Hash.new} 
arrTable[x] = Array.new 

但它不會改變任何事情! Tnx!

+0

spickermann給了一個很好的答案。問題是'arrTable [x] = hshTable'確保每個數組項都指向同一個對象(散列'hshTable')。你想要的是每個條目都有一個新的對象,它是原始散列的副本。 'hshTable.clone'會給你一個哈希表中的新(克隆)對象。 – SteveTurczyn

+0

這與您的問題無關,但生成'hshTable'的簡單方法是'hshTable [「 - 」,*?A ..?Z] .product([0])。to_h',假設您不關心關於鍵的順序。 –

回答

4

我認爲這應該爲你工作:

max_protein = 500 
hash_table = {"-"=>0,"B"=>0,"Z"=>0,"I"=>0,"M"=>0,"T"=>0,"N"=>0,"K"=>0,"S"=>0,"R"=>0,"V"=>0,"A"=>0,"D"=>0,"E"=>0,"G"=>0,"F"=>0,"L"=>0,"Y"=>0,"X"=>0,"C"=>0,"W"=>0,"P"=>0,"H"=>0,"Q"=>0} 

array_table = Array.new(max_protein) { hash_table.clone }