Scala链表stackoverflow

时间:2010-11-12 03:21:35

标签: scala linked-list

使用scala我已经向链表添加了大约100000个节点。当我使用函数长度时,例如mylist.length。我收到一个'java.lang.StackOverflowError'错误,我的列表要处理大吗?该列表只是字符串对象。

4 个答案:

答案 0 :(得分:11)

看起来库实现不是尾递归override def length: Int = if (isEmpty) 0 else next.length + 1。看起来这可以在邮件列表中讨论,以检查是否应该打开增强票据。

您可以像这样计算长度:

def length[T](l:LinkedList[T], acc:Int=0): Int =
  if (l.isEmpty) acc else length(l.tail, acc + 1)

答案 1 :(得分:1)

在Scala中,计算List的长度是一个n阶操作,因此你应该尽量避免它。您可以考虑切换到数组,因为这是一个恒定时间操作。

答案 2 :(得分:0)

您可以尝试增加JVM可用的堆栈/堆大小。

scala JAVA_OPTS="-Xmx512M -Xms16M -Xss16M" MyClass.scala

其中

-Xss<size>  maximum native stack size for any thread
-Xms<size>  set initial Java heap size
-Xmx<size>  set maximum Java heap size

This question有更多信息。

另见This Scala document

答案 3 :(得分:0)

您能确认确实需要使用length方法吗?听起来你可能没有为你的用例使用正确的集合类型(没有任何额外的信息很难说)。列表经过优化,可以使用折叠或尾递归函数进行映射。

尽管如此,这绝对是一种疏忽,可以通过尾递归函数在标准库中轻松修复。希望我们能及时得到2.9.0。