1

scalaで遅延イテレータを作成する方法を知っている人はいますか?

たとえば、各要素のインスタンス化を繰り返したいとします。通過後、インスタンスを停止/メモリから削除したい。

次のようにイテレータを宣言すると:

val xs = Iterator(
 (0 to 10000).toArray,
 (0 to 10).toArray,
 (0 to 10000000000).toArray)

xs が宣言されたときに配列を作成します。これは次のように証明できます。

def f(name: String) = {
  val x =  (0 to 10000).toArray
  println("f: " + name) 
  x
}

val xs = Iterator(f("1"),f("2"),f("3"))

これは次を印刷します:

scala> val xs = Iterator(f("1"),f("2"),f("3"))
f: 1
f: 2
f: 3
xs: Iterator[Array[Int]] = non-empty iterator

誰にもアイデアはありますか?

要素がメモリに残るため、ストリームは適していません。

注: 例として配列を使用していますが、任意の型で動作するようにしたいと考えています。

4

2 に答える 2

2

Scala コレクションにはview、コレクションに相当する遅延を生成するメソッドがあります。の代わりに(0 to 10000).toArray、 を使用します(0 to 10000).view。この方法では、メモリ内に作成される配列はありません。https://stackoverflow.com/a/6996166/90874https://stackoverflow.com/a/4799832/90874https://stackoverflow.com/a/4511365/90874なども参照してください。

于 2013-01-18T10:48:55.940 に答える
1

Iterator名前による呼び出しパラメーターを受け入れるファクトリ メソッドの 1 つを使用します。

最初の例では、次のいずれかを実行できます。

val xs1 = Iterator.fill(3)((0 to 10000).toArray)
val xs2 = Iterator.tabulate(3)(_ => (0 to 10000).toArray)
val xs3 = Iterator.continually((0 to 10000).toArray).take(3)

配列は、必要になるまで割り当てられません。

要素ごとに異なる式が必要な場合は、個別のイテレータを作成して連結できます。

val iter = Iterator.fill(1)(f("1")) ++ 
           Iterator.fill(1)(f("2")) ++ 
           Iterator.fill(1)(f("3"))
于 2013-01-18T11:15:57.267 に答える