微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Ruby以有效的方式从字符串中获取所需的格式化哈希?

当字符串以下面的格式出现时,我想以特定格式哈希:

给定字符串:

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 举报,一经查实,本站将立刻删除。

相关推荐