Нужно разделить массивы на подматрицы определенного размера в 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]]