1

有没有办法在不从循环开头开始的情况下获取循环中的下一个元素?

我知道这next允许迭代到下一个元素,但它从循环的开头开始。我想获取下一个元素并继续循环中的下一条语句。

我正在解析一个结构如下的文本文件:

element 1
part 1
part 2

element 2
part 1
part 2

请注意,每个元素有 11 个部分,因此这只是一个示例。此外,有时在解析过程中会删除一些行,所以我认为我不能为每次循环迭代推进固定数量的元素。

我将所有文本读入一个数组,然后我想使用以下内容处理每一行:

text.each do |L|
  #if L is new element create object to store data
  #parse next line store as part 1
  #parse next line store as part 2
end

我知道如何使用while循环和类似 C 的编码风格来做到这一点,在这种风格中,我明确索引到数组中,并每次按我想要的量递增索引变量,但我想知道是否有 Ruby 方法来做到这一点. 类似于next但会从循环中的同一点继续,只是从下一个元素开始,而不是从循环的开头开始。


编辑:

这是一个简化的示例,说明如何使用while循环解决此问题:

text = ["a", "b", "c", " ", " ", "d", "e", "f"]
i = 0
while i < text.length do
  if text[i] == " " then
    i += 1
  else
    a = text[i]
    b = text[i+1]
    c = text[i+2]
    puts a + b + c
    i += 3
  end
end

请注意,我正在编写的实际代码更复杂。我试图在这里提出一个最简单的例子来说明我想要做什么。

4

2 回答 2

3

简单的。更改eacheach_with_index,并使用索引:

text.each_with_index do |L, i|
  #Get next element
  text[i + 1]
end

但是,您的具体问题有更好的解决方案。使用each_slice

text.each_slice(num_of_parts_to_element + 1) do |element|
  element[0] #element 1
  element[1..-1].each do |part|
    #Iterate over the parts
  end
end
于 2013-08-31T21:38:24.383 回答
1

在评论中采纳@Phrogz 的建议并使用它:

def handle_sequence(sequence)
  puts sequence.join
end

text = ["a", "b", "c", " ", " ", "d", "e", "f"]
sequences = text.split(" ")
sequences.reject! {|sequence| sequence.empty?}
sequences.each {|sequence| handle_sequence(sequence)}

我将它handle_sequence分成一个方法,因为我想你会想做一些别的事情,而不仅仅是将元素连接并打印到标准输出。

顺便说一句,我没有投票,只是要求澄清

于 2013-09-01T08:41:40.473 回答