我有一根这样的弦
str = "uu@p, xx@m, yy@n, zz@m"
我想知道如何将给定的字符串转换为哈希值。(即我的实际要求是,有多少个值(@符号之前)具有m、n和p。我不需要计数,我需要一个确切的值)。输出应该更好,如下图所示,
{"m" => ["xx", "zz"], "n" => ["yy"], "p" => ["uu"]}
谁能帮帮我,好吗?
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"]}
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
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"]}
3条答案
按热度按时间u2nhd7ah1#
IRB会议的直接副本/过去:
ny6fqffe2#
对于新手来说更简单的代码:)
brqmpdu13#
FP样式:
这是一个非常常见的模式。使用Facets.map_by: