2012-01-05 87 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