如何使用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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...