1

配列の配列を変換したいと思います。これは次の方法で実行できます。

var cal = Array.ofDim[Double](300, 10000);   
cal.foreach(x => x.transform(y => some_value))

問題は、変換されたセルのインデックスにアクセスする方法です。例えば:

cal.foreach(x => x.transform(y => x(y.index - 1) + 7))

私はzipWithIndexを使用しようとしました:

cal.foreach(x => x.zipWithIndex.transform(y => (x(y._2) + 7, y._2)));

しかし、これは「cal」値を変更しませんでした。

ありがとう。

4

3 に答える 3

2

その場で更新を行うには、次のような Java っぽい方法で行うことができます。

for( y <- 0 until cal.length; 
     row <- cal( y );
     x <- 0 until row.length ) 
{
  row( x ) = some value // here you can get the indexes through (x, y)
}

// or

for( (row, y) <- cal.zipWithIndex; 
     x <- 0 until row.length ) 
{
  row( x ) = some value // here you can get the indexes through (x, y)
}
于 2013-04-10T10:09:34.780 に答える
0

標準ライブラリに関数が見つからない場合の最も簡単な解決策は、特に単純なものであれば、独自の関数を作成することです。Scala の引数としての関数について、自分でそれを行うことを妨げる魔法は何もありません。

暗黙的なクラスを使用すると、通常の呼び出し規則をエミュレートすることもできます。例えば:

import scala.collection.mutable._

object Extensions {
  implicit class ExtMutSeq[T](val seq: Seq[T]) extends AnyVal {
    def transform_indexed(f: (T, Int) => T) {
      for (i <- 0 until seq.length) {
        seq(i) = f(seq(i), i)
      }
    }
  }
}

object Program extends App {
  import Extensions._
  val a = ArraySeq(1,2,3,4)
  a.transform_indexed((item, pos) => if (pos % 2 == 0) 0 else item)
  println(a)
}

(行の実際のタイプによっては、seq上記のタイプを調整する必要がある場合があります。)

抽象化と再利用という 2 つの利点があります。抽象化により、インデックスを使用して変換の概念を 1 か所にカプセル化できるため、一度記述するだけでよいため再利用できます。また、これは短いコードであるため、標準ライブラリに依存する必要はありません。

于 2013-04-10T12:38:18.960 に答える