2010-06-29 98 views
4

我在Ruby中有一个数组(列表):如何在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"]] 

回答

3

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"]] 
+1

伟大的解决方案,喜欢它很多。 一个简单的评论:在Ruby中,评论是用'#'引入的,而不是'//' – 2010-06-29 23:31:48

+0

@Bryan哎呀!我整天在PHP工作,并在工作日结束时写下了这个答案。很好的抓住:) – 2010-06-30 01:31:09

0

如果你能请使用ActiveSupport(例如,内部的Rails):

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

    dels.zip(objs).map {|e,objs| [e] + objs } 
end