Как это сделать в Ruby? - PullRequest
4 голосов
/ 30 июня 2010

У меня есть массив (список?) В ruby:

allRows = ["start","one","two","start","three","four","start","five","six","seven","eight","start","nine","ten"]

Мне нужно запустить цикл для этого, чтобы получить список, который объединяет элементы от "старта" до другого "старта",как следующее:

listOfRows = [["start","one","two"],["start","three","four"],["start","five","six","seven","eight"],["start","nine","ten"]]

Ответы [ 2 ]

3 голосов
/ 30 июня 2010

На основе Array#split от Rails:

def group(arr, bookend)
  arr.inject([[]]) do |results, element|
    if (bookend == element)
      results << []
    end
    results.last << element

    results
  end.select { |subarray| subarray.first == bookend } # if the first element wasn't "start", skip everything until the first occurence
end

allRows = ["start","one","two","start","three","four","start","five","six","seven","eight","start","nine","ten"]
listOfRows = group(allRows, "start")
# [["start","one","two"],["start","three","four"],["start","five","six","seven","eight"],["start","nine","ten"]]
0 голосов
/ 30 июня 2010

Если вы можете использовать ActiveSupport (например, внутри Rails):

def groups(arr, delim)
  dels = arr.select {|e| == delim }
  objs = arr.split(delim)

  dels.zip(objs).map {|e,objs| [e] + objs }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...