【问题标题】:Iterate over a array and returning the next and the element before current [duplicate]遍历一个数组并返回下一个元素和当前元素之前的元素[重复]
【发布时间】:2011-04-18 23:45:37
【问题描述】:

如何在使用每个迭代数组时从数组中获取当前元素的下一个和之前的元素。

array.each do |a|
   # I want to fetch next and before current element.
end

【问题讨论】:

  • 两个问题:1)什么是开头的“previous”元素和结尾的“next”元素? 2)next元素是否应该是下一次迭代的current元素(即在[ar[4], ar[5], ar[6]]组之后,下一组应该是[ar[5], ar[6], ar[7]]还是[ar[7], ar[8], ar[9]])?

标签: ruby arrays


【解决方案1】:

您可以在迭代时使用Enumerable#each_with_index 获取每个元素的索引,并使用它来获取周围的项目。

array.each_with_index do |a, i|
  prev_element = array[i-1] unless i == 0
  next_element = array[i+1] unless i == array.size - 1
end

【讨论】:

    【解决方案2】:

    看看Enumerable#each_cons方法:

    [nil, *array, nil].each_cons(3){|prev, curr, nxt|
      puts "prev: #{prev} curr: #{curr} next: #{nxt}"
    }
    
    prev:  curr: a next: b
    prev: a curr: b next: c
    prev: b curr: c next: 
    

    如果你喜欢,你可以将它包装在新的 Array 方法中:

    class Array
      def each_with_prev_next &block
        [nil, *self, nil].each_cons(3, &block)
      end
    end
    #=> nil
    
    array.each_with_prev_next do |prev, curr, nxt|
      puts "prev: #{prev} curr: #{curr} next: #{nxt}"
    end
    

    【讨论】:

    • [nil, *array, nil] 代替[nil]+array+[nil] 怎么样?
    • 太棒了!我讨厌+ 变体,但我认为没有比这更漂亮的了。如果您不介意,我会更新答案。
    • 如果有人正在寻找一种方法来“映射”元素而不是仅仅迭代它们,你可以做类似1..9).each_cons(2).map { |a| a }
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多