2010-10-05 11 views

Odpowiedz

45
arr.each_slice(3).to_a 

each_slice zwraca Enumerable, więc jeśli to wystarczy dla ty, nie musisz dzwonić pod numer to_a.

W 1.8.6 trzeba zrobić:

require 'enumerator' 
arr.enum_for(:each_slice, 3).to_a 

Jeśli wystarczy iteracyjne, można po prostu zrobić:

arr.each_slice(3) do |x,y,z| 
    puts(x+y+z) 
end 
+0

Dzięki! to było naprawdę szybkie! – bragboy

+4

Lub 'b = []; b << a.shift (3) do a.empty? '(dla starych Rubys) – Nakilon

+0

@Nakilon: To jednak zniszczy oryginalną tablicę. – sepp2k

3

Jeśli używasz Rails 2.3+ można zrobić coś jak to:

arr.in_groups(3, false) 

Checkout the api docs

+0

To jest złe. Nie dzieli tablicy na poddźwięki o określonym rozmiarze, jak twierdzi autor. Tworzy 3 grupy, tablica bez tablic z 3 –

4

można również wykorzystać to w określonym celu:

((1..10).group_by {|i| i%3}).values #=> [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]] 

w przypadku chcesz tylko dwa podzielonym na partycje tablice:

(1..6).partition {|v| v.even? } #=> [[2, 4, 6], [1, 3, 5]] 
+0

'tablica.group_by' jest bardzo przydatna. Możesz wykonać następujące czynności: 'false_group, true_group = some_array.group_by {| i | i.test_something?()}. values' – Automatico

1

w szynach można użyć metody in_groups_of który dzieli tablicę na grupy o określonej wielkości

arr.in_groups_of(3) # => [[4, 5, 6], [7, 8, 4], [45, 11, nil]] 
arr.in_groups_of(3, false) # => [[4, 5, 6], [7, 8, 4], [45, 11]] 

Podczas gdy metody in_groupsdzieli tablicę na określoną liczbę zrównoważonych grup

arr.in_groups(5) # => [[4, 5], [6, 7], [8, 4], [45, nil], [11, nil]] 
arr.in_groups(5, false) # => [[4, 5], [6, 7], [8, 4], [45], [11]] 
Powiązane problemy