List scala射程长
我不熟悉Scala语言 我需要长字体的射程 我需要一个包含步骤1的[1,2,3…10000000]列表。如果我使用until/to,我会因为使用Long而不是Int而得到一个错误 我尝试编写一个简单的函数,它需要一个开始、结束和一个空列表,并生成一个[start..end]列表 以下是我的功能: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){
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 getOutOfMemory
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元素。”错误消息。