ruby字符串到散列转换

xqkwcwgp  于 2022-11-29  发布在  Ruby
关注(0)|答案(3)|浏览(126)

我有一根这样的弦

str = "uu@p, xx@m, yy@n, zz@m"

我想知道如何将给定的字符串转换为哈希值。(即我的实际要求是,有多少个值(@符号之前)具有m、n和p。我不需要计数,我需要一个确切的值)。输出应该更好,如下图所示,

{"m" => ["xx", "zz"], "n" => ["yy"], "p" => ["uu"]}

谁能帮帮我,好吗?

u2nhd7ah

u2nhd7ah1#

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"]}
ny6fqffe

ny6fqffe2#

对于新手来说更简单的代码:)

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
brqmpdu1

brqmpdu13#

FP样式:

grouped = str
  .split(", ")
  .group_by { |s| s.split("@")[1] }
  .transform_values { |ss| ss.map { |x| s.split("@")[0] } }

#=> {"m"=>["xx", "zz"], "n"=>["yy"], "p"=>["uu"]}

这是一个非常常见的模式。使用Facets.map_by:

require 'facets'
str.split(", ").map_by { |s| s.split("@", 2).reverse }
#=> {"m"=>["xx", "zz"], "n"=>["yy"], "p"=>["uu"]}

相关问题