You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy如何将List按指定切分长度生成二维字符串数组

Groovy列表分片功能核心实现逻辑

方案1:使用Groovy内置特性实现(生产环境推荐)

Groovy的List原生提供了collate()方法,专门用于按指定长度分片,不需要手动编写循环,代码极简且兼容性好:

def workTheList (List data, int cutIndex) {
    // collate返回嵌套List,调用toArray即可转为二维数组,完全符合需求
    return data.collate(cutIndex).toArray()
}

collate会自动处理边界场景:如果列表总长度不是cutIndex的整数倍,最后一个子集合会自动保留剩余元素,不会出现空填充。

方案2:手动实现核心逻辑(适合学习原理)

如果需要自己写逻辑实现,核心步骤如下:

  • 先计算分片总数:计算时要注意把除法操作数转成浮点数,避免Groovy整数除法默认取整导致的精度问题,你现有代码里的Math.ceil计算逻辑调整后即可使用
  • 按分片索引遍历,通过列表区间截取功能获取对应范围的元素,赋值给二维数组对应位置:
    第i个分片的起始索引为i * cutIndex,结束索引为(i+1)*cutIndex - 1,结束索引不能超过列表的最大索引data.size()-1
  • 不要提前定义二维数组第二维的固定长度,避免总长度不是cutIndex整数倍时出现多余空元素

手动实现的参考代码:

def workTheList (List data, int cutIndex){
    // 转double计算避免整数除法误差
    def arraySize = Math.ceil(data.size() / (cutIndex as double)) as int
    println("array size will be " + arraySize)
    // 只定义第一维长度,第二维长度根据实际截取结果动态赋值
    def myArray = new Object[arraySize][]
    for (int i = 0; i < arraySize; i++) {
        def start = i * cutIndex
        def end = Math.min((i + 1) * cutIndex - 1, data.size() - 1)
        // Groovy支持[起始..结束]的区间语法直接截取子列表
        myArray[i] = data[start..end].toArray()
    }
    return myArray
}

注意:你原有代码里new String[arraySize][cutIndex]的写法有缺陷,当列表总长度不是cutIndex整数倍时,最后一个子数组会被强制填充空元素到cutIndex长度,不符合实际需求。

内容的提问来源于stack exchange,提问作者Shahar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:15:08