例如,如果我有这样的数组:
[:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]
我想得到这个:
[[1, [2, 3], 4], [5]]
:open
实际上变为[
而:close
变为]
答案 0 :(得分:10)
您可以使用堆栈执行此操作,但递归设计非常简单:
#!/usr/bin/env ruby
x = [:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]
def parse(list)
result = []
while list.any?
case (item = list.shift)
when :open
result.push(parse(list))
when :close
return result
else
result.push(item)
end
end
return result
end
puts parse(x).inspect
请注意,这会破坏原始阵列。如果你想保留它,你应该在传递之前clone
。
答案 1 :(得分:4)
ar = [:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]
p eval(ar.inspect.gsub!(':open,', '[').gsub!(', :close', ']'))
#=> [[1, [2, 3], 4], [5]]
答案 2 :(得分:0)
与steenslag相同,但更清洁
a = [:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]
eval(a.to_s.gsub(':open,','[').gsub(', :close',']'))
#=> [[1, [2, 3], 4], [5]]