在Kotlin中将2个列表进行比较

时间:2018-02-23 20:25:02

标签: kotlin

我有这两个清单:

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 :(

3 个答案:

答案 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())
}