前言
爲了做多線程處理,所以要先處理一下取到的一個list 分割開後,然後再處理。所以用kotlin 寫了兩個方法,寫在博客裏備忘。
分割指定數量的list
輸入參數:source 原List , size 需要被切割成多少份
sample:
INPUT
sorce : [1,2,3,4,5,6,7]
size: 2
OUTPUT
result [1,2,3,4],[5,6,7]
private fun <T> averageAssign(source: List<T>, size: Int): List<List<T>> {
val result = ArrayList<List<T>>()
var remaider = source.size % size //(先計算出餘數)
val number = source.size / size //然後是商
var offset = 0//偏移量
for (i in 0 until size) {
var value: List<T>?
if (remaider > 0) {
value = source.subList(i * number + offset, (i + 1) * number + offset + 1)
remaider--
offset++
} else {
value = source.subList(i * number + offset, (i + 1) * number + offset)
}
result.add(value)
}
return result
}
分割元素數量相同的list
輸入參數:source 原List , splitItemNum 每個集合裏放幾個元素
sample:
INPUT
sorce : [1,2,3,4,5,6,7]
splitItemNum: 3
OUTPUT
result [1,2,3],[4,5,6],[7]
private fun <T> averageAssignFixLength(source: List<T>?, splitItemNum: Int): List<List<T>> {
val result = ArrayList<List<T>>()
if (source != null && source.run { isNotEmpty() } && splitItemNum > 0) {
if (source.size <= splitItemNum) {
// 源List元素數量小於等於目標分組數量
result.add(source)
} else {
// 計算拆分後list數量
val splitNum = if (source.size % splitItemNum == 0) source.size / splitItemNum else source.size / splitItemNum + 1
var value: List<T>? = null
for (i in 0 until splitNum) {
if (i < splitNum - 1) {
value = source.subList(i * splitItemNum, (i + 1) * splitItemNum)
} else {
// 最後一組
value = source.subList(i * splitItemNum, source.size)
}
result.add(value)
}
}
}
return result
}