Scala实现两Array[Int]按索引相加合并的最优短方案求助
解决数组对应索引相加并保留超长部分的问题
这里有几个简洁高效的方案来实现你需要的数组合并逻辑,既能处理等长数组,也能完美应对长度不等的场景:
方案一:利用zipAll一行搞定(最简洁)
Scala标准库的zipAll方法可以让我们指定当其中一个数组耗尽时使用的默认值,刚好可以利用这个特性来满足需求——因为当某个位置只有一个数组有元素时,加0就等价于直接保留该元素:
array1.zipAll(array2, 0, 0).map { case (a, b) => a + b }
验证示例
对于输入Array(1,2,3)和Array(1,1,1,1,1):
zipAll会生成元组序列:(1,1), (2,1), (3,1), (0,1), (0,1)- 映射相加后得到:
Array(2,3,4,1,1),完全符合你的要求。
方案二:遍历最大长度(更直观)
如果想要更清晰地展示逻辑,可以先获取两个数组的最大长度,然后逐个索引处理:
val maxLength = math.max(array1.length, array2.length) Array.tabulate(maxLength) { i => if (i < array1.length && i < array2.length) array1(i) + array2(i) else if (i < array1.length) array1(i) else array2(i) }
这个方案逻辑一目了然,适合需要明确展示处理规则的场景,效率和zipAll方案一致,都是O(maxLength)的时间复杂度。
为什么原来的zipped.map不行?
你原来的代码(array1, array2).zipped.map(_+_)只会处理到两个数组中较短的那个长度,超出的元素会被直接丢弃,而不是保留,这就是它不符合需求的原因(其实它并不会抛出ArrayIndexOutOfBoundsException,只会截断结果)。
内容的提问来源于stack exchange,提问作者Simon Huenecke
相关产品推荐
相关产品推荐

