2010-09-29 30 views
11

Làm thế nào tôi có thể tìm nạp tiếp và trước phần tử hiện tại từ mảng trong khi lặp mảng với mỗi mảng.Lặp lại trên một mảng và trả về phần tử tiếp theo và trước phần hiện tại

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

Hai câu hỏi sau: 1) Điều gì là "trước" phần tử ở đầu và phần tử "tiếp theo" ở cuối? 2) Nếu phần tử 'next' là phần tử' current' của lần lặp tiếp theo (tức là, sau nhóm '[ar [4], ar [5], ar [6]]', nhóm tiếp theo sẽ là ' [ar [5], ar [6], ar [7]] 'hoặc' [ar [7], ar [8], ar [9]] ')? – Chuck

Trả lời

34

Hãy nhìn vào Enumerable#each_cons phương pháp:

[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: 

Nếu bạn thích, bạn có thể bọc nó trong phương thức mảng mới:

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 
+3

Làm thế nào về '[nil, * array, nil]' thay vì '[nil] + mảng + [nil]'? –

+0

Tuyệt vời! Tôi ghét '+' biến thể, nhưng tôi nghĩ không có gì đẹp hơn. Tôi sẽ cập nhật câu trả lời nếu bạn không phiền. –

+0

nếu ai đó đang tìm kiếm một cách để "ánh xạ" các yếu tố thay vì chỉ lặp qua chúng, bạn có thể làm một cái gì đó như '1..9) .each_cons (2) .map {| a | a} ' – equivalent8

9

Bạn có thể sử dụng Enumerable#each_with_index để lấy chỉ mục của từng phần tử khi bạn lặp lại và sử dụng chỉ mục đó để nhận các mục xung quanh.

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 
Các vấn đề liên quan