当字符串以下面的格式出现时,我想以特定格式哈希:
给定字符串:
str = 'A A = B A = B = C A = B = D A = E = F G = H G = I G = J'
#进入这样的哈希(必需的哈希模式):
{ "A" => { "B" => { "C" => nil,"D" => nil },"E" => { "F" => nil },},"G" => { "H" => nil,"I" => nil,"J" => nil } }
我尝试了很多方法,但这是最接近的:
output = Hash.new line_hash = Hash.new str.each_line do |line| arr = line.split("=") e = arr.first.strip line_hash[e] = {} arr.each_with_index do |ele,i| break unless arr[i+1] line_hash[ele.strip] = arr[i+1] unless output.keys.include?(ele.strip) end output[e] = line_hash unless output.keys.include?(e) end
解决方法
str = "A\nA = B\nA = B = C\nA = B = D\nA = E = F\nG = H\nG = I\nG = J" curr = h = {} str.each_line { |l| l.chomp.split(/\s*=\s*/m).each { |c| curr = curr[c] ||= {}; } curr = h } puts h # => { # "A" => { # "B" => { # "C" => {},# "D" => {} # },# "E" => { # "F" => {} # } # },# "G" => { # "H" => {},# "I" => {},# "J" => {} # } # }
我希望你能原谅我留下空的哈希值而不是叶子上的空值,以便清楚地解决问题.
要使叶子无效:
def leaves_nil! hash hash.each { |k,v| v.empty? ? hash[k] = nil : leaves_nil!(hash[k]) } end
原文地址:https://www.jb51.cc/ruby/268554.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。