使用 Go 為陣列平均分組

前言

目的是均勻地將一個陣列的元素進行分組,並保持原來的順序。例如:

1
2
3
4
5
6
7
8
9
10
11
// 初始陣列
[2, 3, 4, 5, 6, 7, 8, 9]

// 平均分成 3 組
[[2, 3, 4], [5, 6, 7], [8, 9]]

// 平均分成 4 組
[[2, 3], [4, 5], [6, 7], [8, 9]]

// 平均分成 5 組
[[2, 3], [4, 5], [6, 7], [8], [9]]

做法

建立一個 split() 函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func split(nums []int, numberOfGroups int) (chunks [][]int) {
// 分組數量
groupSize := len(nums) / numberOfGroups
// 餘數
remainder := len(nums) % numberOfGroups

// 切片起始點
start := 0

// 以分組數量當作疊代次數
for i := 0; i < numberOfGroups; i++ {
size := groupSize

// 如果有餘數,多分配一個元素到分組中
if i < remainder {
size++
}

// 推進分組
chunks = append(chunks, nums[start:start+size])

// 偏移切片起始點
start += size
}

return chunks
}

使用如下:

1
2
3
4
5
nums := []int{2, 3, 4, 5, 6, 7, 8, 9}

for i := 1; i <= len(nums); i++ {
fmt.Println(split(nums, i))
}

輸出如下:

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