Как я могу разделить массив по разделителям в Ruby? - PullRequest
3 голосов
/ 16 марта 2012

Например, если у меня есть такой массив:

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

Я хочу получить это:

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

:open фактически становится [ и :close становится ]

Ответы [ 3 ]

10 голосов
/ 16 марта 2012

Возможно, вы могли бы сделать это с помощью стека, но рекурсивно проектировать его довольно просто:

#!/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 передать его, если хотите сохранить.

4 голосов
/ 16 марта 2012
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 голосов
/ 16 марта 2012

То же самое для стинслага, но немного чище

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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...