以成对方式添加Scala数组的元素

hot*_*oup 3 scala

Scala 2.12在这里,是Scala的新手.我得到一个Array[Double]代表我本地系统上所有逻辑处理器的CPU负载(%):

val logicalProcessorLoads : Array[Double] = cpu.getProcessorCpuLoadBetweenTicks
Run Code Online (Sandbox Code Playgroud)

出于这个问题,逻辑处理器的数量是机器上物理处理器或"核心"数量的2倍.

所以在四核机器上,会有8个逻辑处理器,所以这个logicalProcessorLoads数组在任何时间点的值都可能是这样的:

[12.4,2.2,10.0,5.0,23.7,18.9,1.1,11.2]

因此,要在任何给定时间点获得所有4个内核的CPU负载,需要我遍历这个8项数组并将每个后续元素对添加到一起,因此:

  • 核心#1 CPU负载为12.4 + 2.2 = 14.6%
  • 核心#2 CPU负载为10.0 + 5.0 = 15.0%
  • 核心#3 CPU负载为23.7 + 18.9 = 42.6%
  • 核心#4 CPU负载为1.1 + 11.2 = 12.3%

我试图找到最简洁+干净的方式在我的阵列上进行这种成对添加,其中输出为perCoreLoads : Array[Double]4个元素,每个元素代表我的4个核心中的每个核心的负载.到目前为止我最好的尝试:

var perCoreLoads : Array[Double] = Array()
for((lpl,i) <- logicalProcessorLoads.zipWithIndex) {
  if(i+1 <= logicalProcessorLoads.size - 1) {
    perCoreLoads :+ (lpl(i) + lpl(i+1))
  }
}
Run Code Online (Sandbox Code Playgroud)

但这看起来有点令人费解,我相信Scala有一些魔力可以帮助我.有任何想法吗?

And*_*kin 5

使用groupedmap:

logicalProcessorLoads.grouped(2).map(_.sum).toList
Run Code Online (Sandbox Code Playgroud)

得到:

List(
  14.600000000000001, 
  15.0, 
  42.599999999999994, 
  12.299999999999999
)
Run Code Online (Sandbox Code Playgroud)

要更好地理解它,请查看返回的中间结果grouped(2):

List(
  List(12.4, 2.2), 
  List(10.0, 5.0), 
  List(23.7, 18.9), 
  List(1.1, 11.2)
)
Run Code Online (Sandbox Code Playgroud)

这些正是手动生成的表中行的加数.