7

我是 Scala 语言的新手。

我需要 Long 类型的 Range。

我需要一个包含步骤 1 的 [1, 2, 3 ... 10000000] 列表。如果我使用 until/to 我会因为使用 Long 而不是 Int 而出现错误。

我尝试编写一个简单的函数,它需要一个开始、一个结束和一个空列表,并生成一个 [start .. end] 列表。

这是我的功能:

def range_l(start : Long, end : Long, list : List[Long]) : List[Long] = {
    if (start == end){
        val add_to_list = start :: list
        return add_to_list
    }
    else {
        val add_to_list = start :: list
        range_l(start + 1, end, add_to_list)
    }
}

如果我这样称呼它:我在以下行中range_l(1L, 1000000L, List())收到错误:OutOfMemoryadd_to_list = start :: list

你能给我什么建议?我怎样才能获得Range[Long]或如何优化功能。如何避免 OutOfMemory?

谢谢你。

4

3 回答 3

15

您可以使用以下语法创建这样的范围:

val range = 1L to 10000000L

'L' 是强制性的,以告知编译器文字是长整数而不是整数。

然后,您可以List在实例上使用几乎所有方法range。它不应该填满你的记忆,因为中间值是在需要时生成的。该范围可以传递给任何期望 a Traversable[Long]、 a Seq[Long]、 anIterable[Long]等的方法。

但是,如果您真的需要一个List公正的调用range.toList(并增加堆大小以容纳所有列表元素)......

于 2012-05-09T10:59:21.633 回答
9

您可以改为使用标准库中的NumericRange[Long]

于 2012-05-09T07:24:34.133 回答
8

您可能不需要范围。我会接受一个 Stream 并对其进行迭代。

def stream(i: Long = 1): Stream[Long] = i #:: stream(i + 1)

生成一个无限流,其中元素之间的差异为 1。因为 Stream 是一个惰性集合,所以您不会收到任何错误。要迭代超过 10000000 个元素,您只需使用以下命令:

val range = stream take 10000000
for (i <- range) {
  ...
}

take 10000000将返回Stream大小为 10000000 的 a。因为Stream是 a,Iterable您可以将其传递给 a 以供理解。

于 2012-05-09T07:15:13.130 回答