2013-10-18 82 views
0

我將元素迭代地分配給一個散列,其值是一個由整數和數組組成的數組。我的當前策略的一個玩具的例子是本(增加數組的第一元素,和推號碼到所述陣列的所述第二元素):然而如何迭代添加鍵/值對,其中每個值是一個數組?

aHash = Hash.new([0, []]) 

[1,3,5,1,1].each do |x| 
    aHash[x] = [aHash[x][0] + 1, aHash[x][1] << x] 
end 

aHash # => {1=>[3, [1, 3, 5, 1, 1]], 3=>[1, [1, 3, 5, 1, 1]], 5=>[1, [1, 3, 5, 1, 1]]} 

環路的遞增部分似乎是工作,追加每個數組不是。所需的哈希應該是這樣的:

aHash # => {1=>[3, [1, 1, 1]], 3=>[1, [3]], 5=>[1, [5]]} 

我也曾嘗試:

[1,3,5,1,1].each do |x| 
    aHash[x] = [aHash.values_at(x)[0][0] + 1, aHash.values_at(x)[0][1] << x] 
end 

aHash # => {1=>[3, [1, 3, 5, 1, 1]], 3=>[1, [1, 3, 5, 1, 1]], 5=>[1, [1, 3, 5, 1, 1]]} 

,但我得到這個相同的不正確的結果。

話雖這麼說,我的問題是:

  1. 我怎樣才能正確,如果不是初始化這個散列,假設是我的問題,或者...
  2. 正確遞增的第一要素散列值,並附加散列值的第二個元素?

回答

2
aHash = Hash.new([0, []]) 

對象在Ruby中通過引用傳遞。您正在爲默認值([0, []])創建一個陣列,並且每次在處訪問缺少的密鑰時,都會將對該陣列的引用傳遞給

的解決方案是創建一個塊中默認的陣列,以便它能夠與每個丟失的鑰匙重新評估:

aHash = Hash.new { [0, []] } 
0

如果我試圖讓你在尋找我會用GROUP_BY結果功能。

a = [1,3,5,1,1] 
p a.group_by{|x|x} #=> {5=>[5], 1=>[1, 1, 1], 3=>[3]} 

如果你真的想你問的格式:

a = [1,3,5,1,1] 
a_transformed = a.group_by{|x|x}.map{|x|[x.first,[x.last.size,x.last]]} 
p Hash[a_transformed] #=> {1=>[3, [1, 1, 1]], 3=>[1, [3]], 5=>[1, [5]]} 
相關問題