Kotlin List 分割方法

前言

爲了做多線程處理,所以要先處理一下取到的一個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
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章