2012-03-16 55 views
3

舉例來說,如果我有一個這樣的數組:如何在Ruby中用分隔符分割數組?

[:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close] 

我想這一點:

[[1, [2, 3], 4], [5]] 

:open有效地成爲[:close成爲]

+0

你試過到目前爲止什麼碼? – GetSet 2012-03-16 13:47:04

回答

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之前通過它。

+5

不錯的解決方案,) – 2012-03-16 14:00:36

+1

不錯,優雅的解決方案! – suvankar 2012-03-16 14:28:25

+2

我不知道你可以使用'any?'作爲'empty?'的否定。這很酷。 – sawa 2012-03-16 15:09:35

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]] 
+0

大聲笑,我只是想發佈這個黑客解決方案:) – fl00r 2012-03-16 14:10:32

+0

我可以建議使用'/,\ s +:close /'。在ruby 1.9中,你可以使用'to_s'而不是'inspect' – fl00r 2012-03-16 14:12:31

+0

這是一個很少的泛型,因爲它只適用於文字數組。另外,你不需要在':close':'.gsub!(':close',']')'之前替換'''就足夠了。 – 2012-03-16 14:16:14

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]]