2011-09-16 28 views
4

我有10個項目的數組,我想它分裂成3個部分看起來像這樣:比each_slice更均衡的數組操作?

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

使用each_slice我可以親近:

a = *(1..10) 
a.each_slice(4) # use 4 so I can fit everything into 3 sections 

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

但我想第一格式更均勻分佈。我可以寫我自己的方法。 但是有沒有內置的方式來做到這一點在紅寶石1.9 +?

更新:

,因爲沒有在辦法,我想改變我對問題的內置 - 你將如何實現呢?

+0

你到底想幹什麼?將你的'(1..10)'切成幾乎平坦的三塊,同時保持整體順序? –

+0

@mu yes正如 – Dty

+0

所述,a.each_slice(3) – jschorr

回答

3

這是我實現

def chunk(a, pieces) 
    size = a.size/pieces 
    extra = a.size % pieces 
    chunks = [] 
    start = 0 

    1.upto(pieces) do |i| 
     last = (i <= extra) ? size.next : size 
     chunks << a.slice(start, last) 
     start = chunks.flatten.size 
    end 

    chunks 
    end 

調用它像這樣

a = *(1..10) 
puts chunk(a, 3) 

將輸出

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

如果一塊尺寸太大,它與空數組墊

a = *(1..10) 
puts chunk(a, 14) 

將輸出

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