Scala View + Stream组合导致OutOfMemory错误。如何用View替换它?

时间:2013-04-25 13:59:32

标签: scala

我正在寻找一个非常简单的问题,Eratosthenes筛选,使用惯用的Scala,用于学习目的。

我已经学会了一个Stream缓存,所以在确定第n个元素时它并不是那么高效,因为它是一个O(n)复杂访问和数据记忆,因此不适合这种情况。

    def primes(nums: Stream[Int]): Stream[Int] = {
        Stream.cons(nums.head,
            primes((nums tail) filter (x => x % nums.head != 0)))
    }

    def ints(n: Int): Stream[Int] = {
        Stream.cons(n, ints(n + 1))

    };
    def nthPrime(n: Int): Int = {
        val prim = primes(ints(2)).view take n toList;
        return prim(n - 1);
    };

整数流是有问题的。完成素数过滤后,JVM运行OutOfMemory。在不使用Streams的情况下实现相同功能的正确方法是什么?

基本上从整数视图中查看素数并显示最后一个元素,而没有记忆?

1 个答案:

答案 0 :(得分:1)

我有类似的情况,其中一个流是一个好主意,但我不需要存储它的值。为了使用流而不存储我创建的值(我称之为)ThrowAwayIterator

class ThrowAwayIterator[T](var stream: Stream[T]) extends Iterator[T] {
  def hasNext: Boolean = stream.nonEmpty
  def next(): T = {
    val next = stream.head
    stream = stream.tail
    next
  }
}

确保您不存储对传入的流实例的引用。