前言
为了做多线程处理,所以要先处理一下取到的一个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
}