【发布时间】:2014-03-02 00:12:04
【问题描述】:
这个方法应该接受一个字符串,并检测字符串中的括号 '(' '{' '[' 是否用相应的(相反的)括号正确关闭。
首先,有没有一种更优雅、更紧凑的方式来写这个位而不使用所有的“或”(||):
split_array.each do |i|
if (i == "{" || i == "(" || i == "[")
left.push(i)
else (i == "}" || i == ")" || i == "]")
right.push(i)
end
end
我的第二个问题是,这段代码很糟糕(见下文)吗?看来我应该能够用更少的行来写这个,但从逻辑上讲,我还没有想出另一个解决方案(还没有。) 该代码适用于大多数测试,但此测试返回 false(请参阅底部的所有驱动程序测试): p valid_string?("[ ( text ) {} ]") == true
任何批评将不胜感激! (另外,如果有更好的部分可以发布这个,请告诉我) 谢谢!
def valid_string?(string)
opposites = { "[" => "]", "{" => "}", "(" => ")", "]" => "[", "}" => "{", ")" => "(" }
left = Array.new
right = Array.new
return_val = true
split_array = string.split(//)
split_array.delete_if { |e| e.match(/\s/) }
split_array.each do |i|
if (i == "{" || i == "(" || i == "[")
left.push(i)
else (i == "}" || i == ")" || i == "]")
right.push(i)
end
end
# p left
# p right
left.each_index do |i|
if left[i] != opposites[right[i]]
return_val = false
end
end
return_val
end
p valid_string?("[ ] } ]") == false
p valid_string?("[ ]") == true
p valid_string?("[ ") == false
p valid_string?("[ ( text ) {} ]") == true
p valid_string?("[ ( text { ) } ]") == false
p valid_string?("[ (] {}") == false
p valid_string?("[ ( ) ") == false
-------更新:尝试了一些不同的方法后,我的重构是这样的:-----------
def valid_string?(str)
mirrored = { "[" => "]", "{" => "}", "(" => ")" }
open_brackets = Array.new
split_str_array = str.split("")
split_str_array.each do |bracket|
if bracket.match(/[\[|\{|\(]/) then open_brackets.push(bracket)
elsif bracket.match(/[\]|\}|\)]/)
return false if mirrored[open_brackets.pop] != bracket
end
end
open_brackets.empty?
end
【问题讨论】:
-
这属于Code Review
-
感谢您的反馈。有没有办法移动它?
-
我将其标记为 Mod.. 他们应该可以为您移动它
-
除非你写得更便于读者阅读,否则你不会得到好的答案。不要从一大段代码开始而不解释它的作用。您在最后编写代码的用法。你应该把它写在开头。在我们最后到达那部分之前,您的所有代码都只是毫无意义的垃圾。
-
为什么不每次看到合适的右括号就弹出?为什么是两个堆栈?
标签: ruby if-statement conditional-statements