这里是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项数组并将每个后续元素对添加到一起,因此:
等。我正在尝试找到最简洁+干净的方法,在我的数组上进行成对添加,输出为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有一些魔力可以帮助我。有什么想法吗?
答案 0 :(得分:5)
将grouped
与map
:
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答案的替代方法是将sliding
与map
一起使用:
logicalProcessorLoads.sliding(2, 2).map(_.sum).toList
给出:
List(
14.600000000000001,
15.0,
42.599999999999994,
12.299999999999999
)
中间结果也与分组非常相似,但sliding
与grouped
完全不同。滑动也适合这个用例。
滑动方法(略微描述您的示例):
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
)