Ruby合并哈希将密钥放入csv字符串

时间:2011-03-24 00:51:47

标签: ruby hash

有没有一种聪明的方法可以在Ruby中实现以下功能?

hash1 = { "a" => 1, "b" => 2, "d" => 3}
hash2 = { "a" => 4, "b" => 5, "c" => 7}
hash3 = { "a" => 4, "d" => 7, "e" => 9}
puts hash1.csvMerge(hash2).csvMerge(hash3)

输出为:

{ "a" => "1,4,4",
  "b" => "2,5,0",
  "c" => "0,7,0",
  "d" => "3,0,7",
  "e" => "0,0,9" }

我要做的是将一堆Ruby哈希合并到一个哈希中,实际上我已经有十几个哈希哈希哈希值,这些值被合并为一个逗号分隔的字符串。

5 个答案:

答案 0 :(得分:2)

hash1.merge(hash2){|key, oldval, newval| [oldval,newval].join(",")}
 => {"a"=>"1,4", "b"=>"2,5", "d"=>3, "c"=>7} 

答案 1 :(得分:1)

hashes = [hash1, hash2, hash3]
keys = hashes.inject({}){|hh, h| hh = hh.merge(h); hh}.keys   # the set of all keys #
default_hash = keys.inject({}){|d, k| d[k] = 0; d}    # hash with value 0 for all keys #
complemented_hashes = hashes.map{|h| default_hash.merge(h)} # missing values filled in #

p Hash[complemented_hashes.map{|h| h.to_a}.flatten(1).group_by{|k, v| k}.
map{|k, v| [k, v.map{|k, v| v}.join(",")]}]

答案 2 :(得分:1)

我不知道这是否存在性能问题

hashes = [hash1, hash2, hash3]
hash_with_all_keys = {}
hashes.each{|hash| hash_with_all_keys.merge!(hash)}
keys = hash_with_all_keys.keys
result_hash_mapping = keys.map do |key|
  value = hashes.map{|hash| hash[key].to_i}.join(",")
  [key, value]
end
result_hash = Hash[result_hash_mapping]

我可以用keys = hashes.inject({}){|merge_hash, hash| merge_hash.merge(hash)}.keys替换第2行到第4行,但我发现很难阅读。

答案 3 :(得分:1)

hash1 = { "a" => 1, "b" => 2, "d" => 3}
hash2 = { "a" => 4, "b" => 5, "c" => 7}
hash3 = { "a" => 4, "d" => 7, "e" => 9}

hashes = [hash1, hash2, hash3]
hashes.each{|h| h.each{|k,v| h[k] = v.to_s }}
res = hashes.inject{|m,h| m.merge(h){|k,old,new| "#{old},#{new}" }} #merge and glue

p res
#=> {"a"=>"1,4,4", "b"=>"2,5", "d"=>"3,7", "c"=>"7", "e"=>"9"}

答案 4 :(得分:1)

功能方法:

hashes = [hash1, hash2, hash3]
result = Hash[hashes.flat_map(&:keys).uniq.map do |key|
  [key, hashes.map { |h| h[key] || 0 }.join(",")]
end]
#=> {"a"=>"1,4,4", "b"=>"2,5,0", "c"=>"0,7,0", "d"=>"3,0,7", "e"=>"0,0,9"}