无法将2个数组组合成一个hash-ruby



我在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"
}

但是,使用散列zip命令

MyHash = Hash[listkey.zip(listvalue)]

我得到这个散列产生的

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

有人能帮忙吗?我试过各种各样的命令将这两个数组合并成一个散列,但似乎都不起作用

干杯

Mike

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

编辑

我刚刚发现散列必须有唯一的密钥,所以有人能帮我找到一种方法,将数组组合成散列,并将值作为数组,例如

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

在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]}

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

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

编辑后回答答案。在这种情况下,group_by有点不方便,所以让我们使用facets的map_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"]}

请检查此代码

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}

这意味着密钥应该是唯一的

最新更新