2014-11-14 43 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 }