Нужно разделить массивы на подматрицы определенного размера в Ruby

У меня есть массив, который выглядит примерно так:

arr = [4, 5, 6, 7, 8, 4, 45, 11]

Я хочу такой необычный метод, как

sub_arrays = split (arr, 3)

Это должно вернуть следующее: [[4, 5, 6], [7,8,4], [45,11]]

Примечание. Этот вопрос не является дубликатом "Как разделить массив на части". Этот вопрос задает вопрос об обработке в пакетах, и этот вопрос касается разделения массивов.

Ответ 1

arr.each_slice(3).to_a

each_slice возвращает Enumerable, поэтому, если этого достаточно для вас, вам не нужно вызывать to_a.

В 1.8.6 вам нужно сделать:

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

Если вам просто нужно выполнить итерацию, вы можете просто сделать:

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

Ответ 2

также может использовать это с определенной целью:

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

если вам просто нужны два секционированных массива:

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

Ответ 3

Если вы используете Rails 2.3+, вы можете сделать что-то вроде этого:

arr.in_groups(3, false)

Проверить api docs

Ответ 4

В Rails вы можете использовать метод in_groups_of, который разбивает массив на группы заданного размера

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]]

В то время как метод in_groups разбивает массив на указанное количество сбалансированных групп

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]]