繁体   English   中英

ruby字符串到哈希转换

[英]ruby string to hash conversion

我有这样的字符串,

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

p h

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM