2017-01-05 2 views
1

Я хотел бы разбить массив на вспомогательные массивы определенной длины.Как перерезать массив в ruby ​​в sub-массивы определенной длины?

Я знаю, что .each_slice будет кусок массива на равные подмассивы длины с остатком пережитком, как так:

a = [1,2,3,4,5,6,7,8,9,10] 
a.each_slice(3).to_a => [[1,2,3],[4,5,6],[7,8,9],[10]] 

Однако, сказать, что я хочу, выход так:

=> [[1],[2,3],[4,5,6],[7,8,9,10]] 

Есть метод в ruby ​​для нарезки массива на разные заданные длины в зависимости от аргументов, которые вы ему даете?

+0

Нет, нет ни. – Zepplock

ответ

4

Попробуйте

a = [1,2,3,4,5,6,7,8,9,10] 
slices = [1,2,3,4].map { |n| a.shift(n) } 

Это разрезает массив на куски

NB, это мутирует исходный массив.

+0

Это отлично работает! Я обманывал его сегодня и еще один вопрос. Можете ли вы сказать мне, почему, если я не устанавливаю массив [1,2,3,4,5,6,7,8,9,10], равный переменной, а вместо этого do - slices = [1,2,3,4] .map {| n | [1,2,3,4,5,6,7,8,9,10] .shift (n)} # Выход - [[1], [1, 2], [1, 2] , 3], [1, 2, 3, 4]] –

1

Я не вижу, как улучшить ответ @ akuhn, но вот несколько других методов, которые можно было бы использовать.

a = [1,2,3,4,5,6,7,8,9,10,11] 
slice_sizes = [1,2,3,4] 

# 1 Stab из ломтиков

def variable_slice(a, slice_sizes) 
    last = 0 
    slice_sizes.each_with_object([]) do |n,arr| 
    arr << a[last,n] 
    last += n 
    end 
end 

variable_slice(a, slice_sizes) 
    #=> [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]] 

# 2 Использование рекурсии

def variable_slice(a, slice_sizes) 
    return [] if slice_sizes.empty? 
    i, *rest = slice_sizes 
    [a.first(i)].concat variable_slice(a[i..-1], rest) 
end 

variable_slice(a, slice_sizes) 
    #=> [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]] 
Смежные вопросы