无法将2个数组组合成哈希 - 红宝石

时间:2012-01-05 12:40:59

标签: ruby arrays hash

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

4 个答案:

答案 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}

这意味着键应该是唯一的