我有这两个清单:
val forecast = listOf(30, 21, 29, 31, 40, 48, 53, 47, 37, 39, 31, 29)
val actual = listOf(27, 31, 27, 26, 21, 13, 21, 18, 33, 35, 40, 36)
并且需要计算每月的预测误差,即forecast-actual
,所以我尝试了以下内容:
var errors: MutableList<Double> = mutableListOf<Double>()
actual
.forEachIndexed { index, d -> forecast[index] - d}
.let { i -> errors.add(i) }
但无效,因为i
forEachIndexed
导致的Unit
不是Double
:(
答案 0 :(得分:12)
你想要比forEach做更多的地图。我会做以下事情,然后把它变成你正在寻找的任何类型(如果你真的想要一个可变的双重列表):
val errors = forecast.zip(actual).map { it.first - it.second }
将列表压缩在一起会为您提供一个元组列表,其中第一个值来自第一个列表(预测),第二个值来自第二个列表(实际)。然后,您可以将该列表映射到每个元组中的值之间的差异。 Map返回一个新列表,其中包含应用于每个项目的更改,而forEach会对每个项目执行此功能,但不会生成新列表。
或更精益的方式:
val errors = forecast.zip(actual){f,a -> f-a)
答案 1 :(得分:3)
只需使用mapIndexed而不是foreachIndexed:
val result = forecast.mapIndexed { i, f -> f - actual[i] }
(当然):
val result = actual.mapIndexed { i, a -> forecast[i] - a }
答案 2 :(得分:0)
<强>问题:强>
您对let
的返回值forEachIndex
应用Unit
。
<强>解决方案:强>
actual.forEachIndexed { index, d ->
errors.add(forecast[index] - d.toDouble())
}