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
相关产品推荐
相关产品推荐

