2017-01-05 3 views
1

私は配列を指定された長さのサブ配列に分割したいと思います。ruby​​の配列を指定された長さのサブ配列にスライスするにはどうすればよいですか?

私は.each_sliceはチャンクそうのような残りの残りと同じ長さのサブアレイに配列されることを知っている:

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

あり:しかし、私はこのような出力が欲しい

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

を言いますあなたがそれを与える引数に応じて異なる長さに配列をスライスするためのルビーのメソッド?

+0

いいえ、何もありません。 – Zepplock

答えて

4

これは作品

NB、これは元の配列を変異させるに配列をスライスするこの

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

を試してみてください。

+0

これは素晴らしい作品です!私は今日それをもっとふざけていて、別の質問があります。配列[1,2,3,4,5,6,7,8,9,10]を変数と同じに設定せず、その代わりにどうすればいいのか教えてください。 スライス= [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刺してスライス

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]] 
関連する問題