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

Scala 2.12中如何对Array[Double]两两求和计算核心CPU负载

简洁优雅的Scala实现方案

嘿,刚接触Scala的话,它的集合API绝对能帮你写出比循环+var优雅得多的代码!针对你把逻辑处理器负载两两相邻求和得到物理核心负载的需求,这里有几种简洁的实现方式:

最直观的分组求和法

Scala的数组(其实所有TraversableOnce类型)都自带grouped(n)方法,它能把集合分成大小为n的连续分组。正好我们需要两两一组,直接用这个方法再求和就行:

val perCoreLoads: Array[Double] = logicalProcessorLoads
  .grouped(2)  // 将数组分成相邻的两两一组,比如示例数组会分成[12.4,2.2], [10.0,5.0]等
  .map(_.sum)  // 对每组的两个元素求和
  .toArray     // 把结果转换回Array[Double]类型

这个写法完全是函数式风格,没有可变变量,代码清晰易懂,完美匹配你的需求。

滑动窗口替代方案

如果你想换一种思路,也可以用sliding(size, step)方法,把步长设为2,效果和grouped(2)完全一致:

val perCoreLoads: Array[Double] = logicalProcessorLoads
  .sliding(2, 2)  // 滑动窗口大小为2,每次移动2步,等价于两两分组
  .map(_.sum)
  .toArray

手动配对(适合理解逻辑)

如果想更明确地看到“偶数索引和奇数索引配对”的逻辑,还可以用splitAt+zip的组合:

// 把数组分成前半段(偶数位置的逻辑处理器)和后半段(奇数位置的逻辑处理器)
val (firstHalf, secondHalf) = logicalProcessorLoads.splitAt(logicalProcessorLoads.length / 2)
// 两两配对后求和
val perCoreLoads: Array[Double] = firstHalf.zip(secondHalf).map { case (a, b) => a + b }

不过这种写法不如前两种简洁,更适合用来理解配对的底层逻辑。

对比你原来的实现,这些方法都避免了使用可变变量和手动索引操作,不仅代码更短,还消除了索引越界的潜在风险(当然题目里数组长度肯定是偶数,但函数式写法本身更安全)。

内容的提问来源于stack exchange,提问作者hotmeatballsoup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:13:35