2016-06-22 18 views
10

Jak mogę iteracyjne nad tablicy ruby ​​i zawsze dwie wartości, bieżący i następny, jak:Iterate parami za pomocą tablicy ruby ​​

[1,2,3,4,5,6].pairwise do |a,b| 
    # a=1, b=2 in first iteration 
    # a=2, b=3 in second iteration 
    # a=3, b=4 in third iteration 
    # ... 
    # a=5, b=6 in last iteration 
end 

My usecase: Chcę sprawdzić, czy tablica jest posortowana , i mając taki iterator, zawsze mogę porównać dwie wartości.

ja nie szukam each_slice jak w tej kwestii: Converting ruby array to array of consecutive pairs

Odpowiedz

18

Szukasz each_cons:

(1..6).each_cons(2) { |a, b| p a: a, b: b } 
# {:a=>1, :b=>2} 
# {:a=>2, :b=>3} 
# {:a=>3, :b=>4} 
# {:a=>4, :b=>5} 
# {:a=>5, :b=>6} 
+2

Tak, to jest dokładnie to, co trzeba! Przejrzałem [Enumerable] (http://ruby-doc.org/core-2.1.0/Enumerable.html) i [Enumerator] (http://ruby-doc.org/core-2.1.0/Enumerator. html), ale tego nie widziałem. Thx – Andi

+2

@Andi i dotyczące twojego przypadku użycia: 'ary.each_cons (2) .all? {| a, b | a <= b} 'zwraca' true', jeśli wartości są posortowane. (niestety, nie możesz użyć 'all? (&: <=)' tutaj ze względu na sposób, w jaki 'each_cons' daje wartości) – Stefan