我在ruby(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"
}
但是使用hash zip命令
MyHash = Hash[listkey.zip(listvalue)]
我得到了这个哈希值
puts MyHash
{
"service_monitor_errorlog"=>"service_monitor_errorlog.current",
"wmt_errorlog"=>"wmt_errorlog.current",
"syslog"=>"syslog.txt"
}
有人可以帮忙吗?我已经尝试了各种命令将2个数组合并为一个哈希,但它们似乎都没有工作
干杯
麦克
+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++
修改
我刚刚发现哈希必须有唯一的密钥,所以任何人都可以帮我找到一种方法来组合数组以形成一个哈希值,例如数组。
{
"service_monitor_errorlog"=>["service_monitor_errorlog.0", "service_monitor_errorlog.current"]
"wmt_errorlog"=> ["wmt_errorlog.0", "wmt_errorlog.current"]
"syslog"=> ["syslog.txt"]
}
答案 0 :(得分: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
答案 1 :(得分:2)
编辑后回答答案。 group_by
在这种情况下有点不方便,所以让我们使用facet'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"]}
答案 2 :(得分: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]}
答案 3 :(得分: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}
这意味着键应该是唯一的