Scala中如何优雅地将String数组按指定大小切分为多个子数组
数组按固定大小分组的实现方案
1. 标准库原生实现(最优雅,推荐首选)
Scala 集合的标准库已经内置了对应能力,直接调用grouped方法即可实现需求,代码量极低:
val arr1: Array[String] = Array("a", "b", "c", "d", "e", "f") val blockSize = 2 // grouped返回迭代器,调用toArray转为目标类型 val res = arr1.grouped(blockSize).toArray
运行后res的结果就是Array(Array("a", "b"), Array("c", "d"), Array("e", "f")),完全匹配预期。哪怕你没有提前保证数组长度可被分组大小整除,该方法也会自动把剩余不足一个分组的元素放到最后一个子数组里,适配性很强。
2. 手动实现思路(自定义逻辑参考)
如果需要自己实现分组逻辑,可以参考索引映射的思路:
def groupBySize[T](originArr: Array[T], blockSize: Int): Array[Array[T]] = { // 先计算总分组数 val groupCount = originArr.length / blockSize Array.tabulate(groupCount) { index => // 按索引取对应区间的切片作为子数组 originArr.slice(index * blockSize, (index + 1) * blockSize) } } // 调用示例 val res = groupBySize(arr1, 2)
核心逻辑说明:
- 首先通过原数组长度除以分组大小,得到总共有多少个完整分组
- 用
tabulate方法生成分组数量长度的新数组,每个位置对应一个子分组 - 用
slice方法截取原数组对应区间的元素作为子分组内容,slice为左闭右开区间,刚好适配分组的起止索引
内容的提问来源于stack exchange,提问作者bruno
相关产品推荐
相关产品推荐

