2012-08-03 32 views
2

我有以下陣列紅寶石 - 組通過重複多次哈希

t = [ 
    {nil => 1, 10 => 2, 16 => 4, 5=> 10}, 
    {nil => 9, 5 => 2, 17 => 3, 10 => 2}, 
    {10 => 4, 5 => 9, 17 => 1} 
] 

我怎麼能得到這個作爲結果的關鍵?

{nil => [1,9,0],10 => [2,2,4], 16 => [4,0,0], 5 => [10,2,9], 17=>[0,3,1]} 

我已經看到了,我可以用這樣的

t.group_by{|h| h['key']} 

,但我不知道我是否可以把一個正則表達式的括號內

在此先感謝

哈維爾

編輯:

只是想組由陣列內的每個散列的每個鍵,如果該鍵不存在,則該值爲0的散列

+0

我這裏看不到任何圖案... – phoet 2012-08-03 20:07:42

+0

@phoet好,我知道這一點,但在這裏(http://stackoverflow.com/questions/7670043/ruby-group-按鍵的值)他可以用type鍵來分組,所以也許我可以用2位數的鍵號進行分組或者無 – JavierQQ23 2012-08-03 20:09:48

+2

這個'sort'有點瘋狂,我也沒有看到這個模式...你能解釋什麼是邏輯到達{nil => [1,9,0],10 => [2,2,4],16 => [4,0,0],5 = > [10,2,9],17 => [0,3,1]}'? – 2012-08-03 20:11:53

回答

1

不是我曾經寫過的最優雅的代碼嘗試,但它的工作,很容易理解:

def jqq(a) 
    keys = [] 
    result = {} 

    a.each do |h| 
    keys += h.keys 
    end 

    keys.uniq.each do |key| 
    result[key] = [] 
    a.each do |h| 
     h.default = 0 
     result[key] << h[key] 
    end 
    end 

    result 
end 

t = [ 
    {nil => 1, 10 => 2, 16 => 4, 5=> 10}, 
    {nil => 9, 5 => 2, 17 => 3, 10 => 2}, 
    {10 => 4, 5 => 9, 17 => 1} 
] 

puts jqq(t) 
# {nil=>[1, 9, 0], 10=>[2, 2, 4], 16=>[4, 0, 0], 5=>[10, 2, 9], 17=>[0, 3, 1]} 
+0

謝謝,還有一個答案有一個較短的方法,但你先回答:) – JavierQQ23 2012-08-03 21:16:02

1

我不認爲有任何的任何功能可 只是給了一個與哈希

def do_my_work(data) 
    hash = {} 
    #get all keys first 
    arr.map{|m| m.keys}.flatten.uniq.each {|a| hash[a]=[]} 
    # Now iterate and fill the values 
    arr.each do |elm| 
     hash.each do |k,v| 
     hash[k] << (elm[k].nil? ? 0 : elm[k]) 
     end 
    end 
    end 

    hash = do_my_work(t) 

    puts hash 
    # => {nil=>[1, 9, 0], 10=>[2, 2, 4], 16=>[4, 0, 0], 5=>[10, 2, 9], 17=>[0, 3, 1]} 
+0

我試圖把零置於不存在的位置,因此17不是第一個散列的一部分,它必須顯示這個:17 => [0,3 ,1] – JavierQQ23 2012-08-03 20:55:00

+0

@ JavierQQ23,檢查更新的答案 – PriteshJ 2012-08-03 21:10:54

2

怎麼樣這一個模糊:

t = [ 
    {nil => 1, 10 => 2, 16 => 4, 5=> 10}, 
    {nil => 9, 5 => 2, 17 => 3, 10 => 2}, 
    {10 => 4, 5 => 9, 17 => 1} 
] 

# Create hash of possible keys 
keys = t.reduce({}) { |m, h| h.each_key { |k| m[k] = [] }; m } 

# Iterate through array, for each hash, for each key, append the 
# value if key is in hash or zero otherwise 
t.reduce(keys) { |m, h| m.each_key { |k| m[k] << (h[k] || 0) }; m } 

puts keys 
#=> {nil=>[1, 9, 0], 10=>[2, 2, 4], 16=>[4, 0, 0], 5=>[10, 2, 9], 17=>[0, 3, 1]} 
+0

感謝您分享您的答案:) – JavierQQ23 2012-08-03 21:37:07