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

时间:2018-05-17 15:56:36

标签: scala

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

val logicalProcessorLoads : Array[Double] = cpu.getProcessorCpuLoadBetweenTicks

为了这个问题,逻辑处理器的数量是机器上物理处理器或“核心”数量的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个元素,每个元素代表我的每个元素的负载核心。到目前为止我最好的尝试:

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

但这看起来有点令人费解,我确信Scala有一些魔力可以帮助我。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

groupedmap

一起使用
logicalProcessorLoads.grouped(2).map(_.sum).toList

给出:

List(
  14.600000000000001, 
  15.0, 
  42.599999999999994, 
  12.299999999999999
)

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

List(
  List(12.4, 2.2), 
  List(10.0, 5.0), 
  List(23.7, 18.9), 
  List(1.1, 11.2)
)

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

答案 1 :(得分:1)

使用地图方法滑动

@ andrey-tyukin答案的替代方法是将slidingmap一起使用:

logicalProcessorLoads.sliding(2, 2).map(_.sum).toList

给出:

List(
    14.600000000000001, 
    15.0, 
    42.599999999999994, 
    12.299999999999999
)

中间结果也与分组非常相似,slidinggrouped完全不同。滑动也适合这个用例。

滑动方法(略微描述您的示例)

val perCoreLoads = for {
  lpl <- logicalProcessorLoads.sliding(2, 2)
} yield lpl(0) + lpl(1)

println(perCoreLoads.toList)

给出:

List(
    14.600000000000001, 
    15.0, 
    42.599999999999994, 
    12.299999999999999
)