ruby字符串到哈希转换
我有一个像这样的字符串,
str = "uu@p, xx@m, yy@n, zz@m"
我想知道如何将给定的字符串转换为哈希。 (即我的实际要求是,有多少个值(在@符号之前)有m,n和p。我不想计数,我需要一个确切的值)。 输出会更好像这样,
{"m" => ["xx", "zz"], "n" => ["yy"], "p" => ["uu"]}
可以帮帮我吗?
直接复制/过去的IRB会议:
>> str.split(/, /).inject(Hash.new{|h,k|h[k]=[]}) do |h, s| .. v,k = s.split(/@/) .. h[k] << v .. h .. end => {"p"=>["uu"], "m"=>["xx", "zz"], "n"=>["yy"]}
更简单的新手代码:)
str = "uu@p, xx@m, yy@n, zz@m" h = {} str.split(",").each do |x| v,k = x.split('@') h[k] ||= [] h[k].push(v) end ph
FP风格:
grouped = str.split(", ").group_by { |s| s.split("@")[1] } Hash[grouped.map { |d, emails| [d, emails.map { |s| s.split("@")[0] }] }] #=> {"m"=>["xx", "zz"], "n"=>["yy"], "p"=>["uu"]}
像往常一样,如果您采用Facets酷抽象(无需安装整个库,只需将特定方法复制到扩展模块),解决方案就会更短更清晰:
require 'facets' str.split(", ").map_by { |s| s.split("@", 2).reverse } #=> {"m"=>["xx", "zz"], "n"=>["yy"], "p"=>["uu"]}
Facets#map_by
= group_by
+ map