Scala数组更新任务:基于label索引的元素修改需求
Scala数组更新逻辑实现
先把咱们要实现的规则再明确一遍,避免歧义:
- 当传入单个label索引时:将该索引位置的元素值加1,同时从该索引的下一个位置开始,数组中所有后续元素的值都加1;
- 当传入多个label索引时:仅以最后一个label索引为准,执行和单个label相同的操作——即把该位置的元素加1,之后所有后续元素也加1;
(注:这里默认数组索引是0-based,也就是第一个元素索引为0,如果你的需求是1-based,只需要在代码里做个简单转换就行)
接下来直接上实现代码,我会逐行解释逻辑:
def updateArray(arr: Array[Int], labels: Int*): Array[Int] = { // 处理空label的情况(如果不需要可以去掉这行) if (labels.isEmpty) return arr.clone() // 取最后一个label索引,确保索引在数组合法范围内 val lastLabel = labels.last require(lastLabel >= 0 && lastLabel < arr.length, s"Label index $lastLabel is out of bounds for array of length ${arr.length}") // 先复制原数组,避免修改原数组(如果允许修改原数组可以去掉clone) val updatedArr = arr.clone() // 第一步:更新最后一个label位置的元素 updatedArr(lastLabel) += 1 // 第二步:从label的下一个位置开始,所有元素加1 for (i <- lastLabel + 1 until updatedArr.length) { updatedArr(i) += 1 } updatedArr }
代码解释
- 参数定义:
arr是待更新的数组,labels: Int*是可变参数,支持传入单个或多个索引值; - 空label处理:如果没有传入任何label,直接返回原数组的副本(避免原数组被意外修改);
- 索引合法性校验:用
require确保最后一个label索引在数组的有效范围内,避免数组越界异常; - 数组复制:使用
clone()创建原数组的副本,这样不会修改原数组的内容(如果业务允许直接修改原数组,可以去掉这一步,直接操作原数组); - 元素更新:先把最后一个label位置的元素加1,然后遍历从该位置下一个索引到数组末尾的所有元素,逐个加1;
测试示例
咱们用你提到的例子来测试:
假设原数组是Array(1,2,3,4,5,6,7),labels是2,4(最后一个label是索引4,对应原数组的第五个元素5):
val originalArr = Array(1,2,3,4,5,6,7) val result = updateArray(originalArr, 2,4) // 输出结果:Array(1,2,3,4,6,7,8)
完全符合你描述的预期:第五个元素5变为6,第六个及之后的元素(6、7)都加1变成7、8。
如果是单个label的情况,比如label是3(对应原数组第四个元素4):
val resultSingle = updateArray(originalArr, 3) // 输出结果:Array(1,2,3,5,6,7,8)
第四个元素4变为5,后面的5、6、7都加1变成6、7、8。
内容的提问来源于stack exchange,提问作者lserlohn
相关产品推荐
相关产品推荐

