2012-08-03 33 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