Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以成对方式添加Scala数组的元素_Scala - Fatal编程技术网

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

以成对方式添加Scala数组的元素,scala,Scala,这里是Scala 2.12,也是Scala的新功能。我得到一个数组[Double],它表示本地系统上所有逻辑处理器的CPU负载(%): val logicalProcessorLoads : Array[Double] = cpu.getProcessorCpuLoadBetweenTicks 对于这个问题,逻辑处理器的数量是机器上物理处理器或“核心”数量的2倍 因此,在四核机器上,将有8个逻辑处理器,因此此logicalProcessorLoads阵列在任何时间点的值可能如下所示: [12.

这里是Scala 2.12,也是Scala的新功能。我得到一个
数组[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%
等等。我正试图找到在我的数组上进行这种成对加法的最简洁、干净的方法,其输出是一个
percorloads: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))
  }
}
var percorloads:Array[Double]=Array()

对于((lpl,i)使用
分组
映射

logicalProcessorLoads.grouped(2).map(_.sum).toList
logicalProcessorLoads.sliding(2, 2).map(_.sum).toList
给出:

List(
  14.600000000000001, 
  15.0, 
  42.599999999999994, 
  12.299999999999999
)
List(
    14.600000000000001, 
    15.0, 
    42.599999999999994, 
    12.299999999999999
)
List(
    14.600000000000001, 
    15.0, 
    42.599999999999994, 
    12.299999999999999
)
为了更好地理解它,请查看分组(2)
返回的中间结果:


这些正是手动生成表中各行的总和。

使用地图方法滑动

@andrey tyukin答案的另一种选择是使用
滑动
地图

logicalProcessorLoads.grouped(2).map(_.sum).toList
logicalProcessorLoads.sliding(2, 2).map(_.sum).toList
给出:

List(
  14.600000000000001, 
  15.0, 
  42.599999999999994, 
  12.299999999999999
)
List(
    14.600000000000001, 
    15.0, 
    42.599999999999994, 
    12.299999999999999
)
List(
    14.600000000000001, 
    15.0, 
    42.599999999999994, 
    12.299999999999999
)
中间结果也将非常类似于分组,但是
滑动
分组
是非常不同的
。滑动也将适合此用例


滑动方法(对您的示例略加说明)

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

println(perCoreLoads.toList)

噢,拉拉,喜欢它!谢谢!你
zipWithIndex
,然后你模式匹配
i
,然后你就再也不用
i
。那么
zipWithIndex
i
有什么意义呢?而且,
分组
滑动
是密切相关的,看起来像
分组(n)
可以定义为滑动的一种特殊情况,即滑动(n,n)