0

一部の値が s であるListof case オブジェクトがあり、NaNそれらを に置き換える必要があり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。だから私は別のリストを追加しましたが、タイプの不一致がありました:

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

これが機能しないのはなぜですか?NaNs をに置き換えるより良い方法は何でしょう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すべての要素を反復処理するだけですが、要素を type から type の新しいコレクションを返すmapようにマップできます。ABB

于 2013-02-25T16:19:52.550 に答える
1

あなたの最初の質問は上で答えられていないので、私はこれがうまくいかないことを付け加えたいと思いました。+=

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

ListBuffer[SystemInformation]この場合は a を返します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 に答える