1. ホーム
  2. scala

[解決済み] Scalaにおける効率的なインデックス付き反復処理

2023-03-10 10:12:04

質問

Scalaは古いJavaのスタイルを持っていないため for ループはありません。

// does not work
val xs = Array("first", "second", "third")
for (i=0; i<xs.length; i++) {
  println("String #" + i + " is " + xs(i))
}

を使わずに効率的に反復処理を行うにはどうしたらよいでしょうか? var 's?

こんなことができる

val xs = Array("first", "second", "third")
val indexed = xs zipWithIndex
for (x <- indexed) println("String #" + x._2 + " is " + x._1)

のようになりますが、リストが2回走査されることになり、あまり効率的ではありません。

どのように解決するのですか?

2回トラバースするよりもずっと悪いことに、ペアの中間配列が作成されます。 あなたは view . を実行すると collection.view を実行した場合、それ以降の呼び出しは反復処理中に遅延的に動作していると考えることができます。もし、完全に実現された適切なコレクションを取得したい場合は force を呼び出します。ここでは、それは無駄でコストがかかる。そこで、コードを次のように変更する。

for((x,i) <- xs.view.zipWithIndex) println("String #" + i + " is " + x)