0

我有一个Listcase 对象,其中一些值为NaNs,我必须将它们替换为0.0. 到目前为止,我尝试了这段代码:

var systemInformation: List[SystemInformation] = (x.getIndividualSystemInformation)

systemInformation.foreach[SystemInformation] {
  _ match {
    case SystemInformation(a, b, c, d, e, f, g, h, i, j, k, l, m, x) if x.isNaN()
      => SystemInformation(a, b, c, d, e, f, g, h, i, j, k, l, m, 0.0)
    case SystemInformation(a, b, c, d, e, f, g, h, i, j, k, l, m, x) if !x.isNaN()
      => SystemInformation(a, b, c, d, e, f, g, h, i, j, k, l, m, x)
  }
}

但这不会将更改写回systemInformation. 所以我添加了另一个 List 但类型不匹配:

var systemInformation: List[SystemInformation] = (x.getIndividualSystemInformation)

var systemInformationWithoutNans: ListBuffer[SystemInformation] = new ListBuffer[SystemInformation]
systemInformation.foreach[SystemInformation] {
  _ match {
    case SystemInformation(a, b, c, d, e, f, g, h, i, j, k, l, m, x) if x.isNaN()
      => systemInformationWithoutNans += SystemInformation(a, b, c, d, e, f, g, h, i, j, k, l, m, 0.0)
    case SystemInformation(a, b, c, d, e, f, g, h, i, j, k, l, m, x) if !x.isNaN()
      => SystemInformation(a, b, c, d, e, f, g, h, i, j, k, l, m, x)
  }
}

错误发生在与+=和 的行上,如下所示:

type mismatch;
found : scala.collection.mutable.ListBuffer[com.x.interfaces.SystemInformation]
required: com.x.interfaces.SystemInformation

为什么这不起作用?NaN用 s 替换s的更好方法是0.0什么?

4

3 回答 3

4

建议使用地图作为 bluenote10,但另外,如何:

val transformedSystemInformation = systemInformation map (_ match {
    case s:SystemInformation if s.x.isNan() => s.copy(x = 0.0)
    case _ => _
})
于 2013-02-25T16:24:49.467 回答
3

您应该使用map而不是foreach.

您的第一个解决方案基本上是正确的方法,但foreach只迭代所有元素,而map允许将元素从 type 映射AB返回一个新的 type 集合B

于 2013-02-25T16:19:52.550 回答
1

由于上面没有回答您的第一个问题,我想我会补充一点,这是行不通的,因为该方法+=

def +=(x: A): ListBuffer.this.type

在这种情况下返回 a ListBuffer[SystemInformation],但您已foreach按类型参数化SystemInformation

foreach[SystemInformation]

这就是编译器期望类型SystemInformation而不是ListBuffer[SystemInformation]返回错误的原因

type mismatch;
found : scala.collection.mutable.ListBuffer[com.x.interfaces.SystemInformation]
required: com.x.interfaces.SystemInformation

另一方面,如果您从 foreach 中删除类型参数化,您的示例将编译:

...
systemInformation.foreach { ... }
...

为了获得更好的方法,使用了Ian McMahon建议的方法。

于 2013-02-25T19:10:50.143 回答