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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:28:38