Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List scala射程长_List_Scala_Append_Range_Out Of Memory - Fatal编程技术网

List scala射程长

List scala射程长,list,scala,append,range,out-of-memory,List,Scala,Append,Range,Out Of Memory,我不熟悉Scala语言 我需要长字体的射程 我需要一个包含步骤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){

我不熟悉Scala语言

我需要长字体的射程

我需要一个包含步骤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\u l(1L,1000000L,List())
I get
OutOfMemory
error在下面的一行:
add\u to\u List=start::List

你能给我什么建议?如何获得
范围[Long]
或如何优化函数。我怎样才能避免失去记忆


谢谢。

您可能不需要范围。我将获取一条流并在其上迭代

def stream(i: Long = 1): Stream[Long] = i #:: stream(i + 1)
生成一个无限流,其中元素之间的差值为1。因为流是一个懒惰的集合,所以您不会得到任何错误。要迭代10000000个元素,只需使用以下命令:

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

对于(i您可以改为使用标准库。

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

val range = 1L to 10000000L
必须使用“L”来通知编译器,literal是long而不是int

然后,您可以在实例
范围
上使用几乎所有
列表
方法。它不应该填充您的内存,因为中间值是在需要时生成的。该范围可以传递给任何需要
可遍历[Long]
Seq[Long]
可遍历[Long]
的方法


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

范围通常不需要具体化。请在REPL上尝试
1.to(Int.MaxValue)
,并查看结果类型。对于此类类型,请随意选择:)您谈论的是
范围
,但函数返回的
列表
在scala中是不同的类型。如果您想要
List[Long]
,您可以
List.range(0L,10)
为什么需要这样的范围?很容易得到一个(参见paradigmatic的答案),但使用它通常是不切实际的。也许有更好的办法来解决你的问题。还有,你的错误是什么
1到10000000
不会给出错误。尽管
1L到1000000000L
会生成一个IllegalArgumentException:“seq不能包含超过Int.MaxValue的元素”@DNA确实是,在这种情况下,您可以使用streams或您自己的迭代器。标准库集合有一个size方法,该方法必须返回Int。。。如果您有特殊需要,应该使用特殊集合。对于长数字,它还将抛出“java.lang.IllegalArgumentException:多个Int.MaxValue元素。”错误消息。