2012-01-05 81 views
1

我有创造的红宝石哈希出2门阵列(1.9.2)无力2个阵列组合成一个哈希 - 红宝石

我的问题是一些哈希键的几个问题是相同的,这似乎导致

所以我的第一个阵列(称为listkey)包含以下5项

puts listkey 

service_monitor_errorlog 
service_monitor_errorlog 
wmt_errorlog 
wmt_errorlog 
syslog 

第二(称为listvalue)包含以下5项

puts listvalue 

service_monitor_errorlog.0 
service_monitor_errorlog.current 
wmt_errorlog.0 
wmt_errorlog.current 
syslog.txt 
问题

我想要的是一个包含所有5个项目的散列,例如

{ 
"service_monitor_errorlog"=>"service_monitor_errorlog.0", 
"service_monitor_errorlog"=>"service_monitor_errorlog.current", 
"wmt_errorlog"=>"wmt_errorlog.0", 
"wmt_errorlog"=>"wmt_errorlog.current", 
"syslog"=>"syslog.txt" 
} 

但是使用散列zip命令

MyHash = Hash[listkey.zip(listvalue)] 

我得到这个哈希生成

puts MyHash 
{ 
"service_monitor_errorlog"=>"service_monitor_errorlog.current", 
"wmt_errorlog"=>"wmt_errorlog.current", 
"syslog"=>"syslog.txt" 
} 

谁能帮助?我已经试过各种命令到2个阵列合并成一个散列,但他们都不工作

干杯

迈克

+++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ +++

编辑

我刚刚发现了hashs必须有独特的键,以便任何人都可以帮我找出一种方法来阵列组合,以形成与值阵列例如哈希

{ 
"service_monitor_errorlog"=>["service_monitor_errorlog.0", "service_monitor_errorlog.current"] 
"wmt_errorlog"=> ["wmt_errorlog.0", "wmt_errorlog.current"] 
"syslog"=> ["syslog.txt"] 
} 
+2

你不能在哈希 – Bohdan 2012-01-05 12:50:34

+2

网站注二等完全相同的键:使用“P”或“PP”或者“把OBJ “检查”来检查对象,“提出”使它变得混乱。 – tokland 2012-01-05 13:22:54

回答

2

在1。9我可能做到这一点:

listkey.zip(listvalue).each_with_object(Hash.new{|h,k| h[k] = []}) do |(k,v), h| 
    h[k] << v 
    end 

例子:

a=['a','b','c','a'] 
b=[1,2,3,4] 
a.zip(b).each_with_object(Hash.new{|h,k| h[k]=[]}) { |(k,v), h| h[k] << v } 
#=> {"a"=>[1, 4], "b"=>[2], "c"=>[3]} 
+0

+1。感谢教导'|(k,v),h |'是可能的。 – 2012-01-05 13:54:34

0

请检查该代码

a=['a','b','c','a'] 
b=[1,2,3,4] 

c=Hash.new 

a.each_with_index do |value,key| 
    #puts key 
    #puts value 
    c[value]=b[key] 
end 
puts c 

输出是

{"a"=>4, "b"=>2, "c"=>3} 

这意味着关键应该是唯一的

2

为您更新的问题,一个(丑陋的)解决方案

the_hash = listkey.zip(listvalue).inject({}) do | a, (k, v) | 
    a[k] ||= [] 
    a[k] << v 
    a 
end 

或(不inject

the_hash = {} 
listkey.zip(listvalue).each do | k, v | 
    the_hash[k] ||= [] 
    the_hash[k] << v 
end 
2

回答的答案编辑后。 group_by在这种情况下有点不方便,所以让我们使用方面map_by,这是一个GROUP_BY,让你来决定你想要什么积累:

require 'facets' 
Hash[xs.zip(ys).map_by { |k, v| [k, v] }] 
#=> {"syslog"=>["syslog.txt"], 
# "service_monitor_errorlog"=> 
#  ["service_monitor_errorlog.0", "service_monitor_errorlog.current"], 
# "wmt_errorlog"=>["wmt_errorlog.0", "wmt_errorlog.current"]} 
+0

感谢所有我会给这些去,让你知道它如何运作 – user891380 2012-01-05 13:48:20

+0

+1。感谢您指出方面。 – 2012-01-05 13:49:28