2

我在大小为 100000 的列表中使用 Collections.sort() 并收到 StackOverFlow 错误。我怎样才能扩大规模?这是代码:

这是一个大项目的一部分。Collections.sort() 在列表上被迭代调用,如下所示:列表大小在每一步都会减小,并且该过程迭代直到列表的大小变为 1。

public static Node buildTree(int d,  List<kdtrees.DataPoint> list) 
{
   if(list.isEmpty())
   {   
       return null;
   }

   else if(list.size() == 1) // S is singleton, return leaf
   {  
       System.out.println(list.get(list.size() - 1).text);
       Node t = new Node(0,0,null,null,list.get(list.size() - 1));

       return t;
   }

   else
   {           


      Collections.sort(list, compByX);
       double m = findMedian(d, list);


       List<kdtrees.DataPoint> left = new ArrayList<kdtrees.DataPoint>();
       List<kdtrees.DataPoint> right = new ArrayList<kdtrees.DataPoint>();

       for(DataPoint i: list)
       {
           if(i.Xvalue < m) 
           {
             left.add(i);
           }
           else
           {
             right.add(i);
           }


       }


        Node t = new Node(d, m, buildTree((d+1)%3,left)buildTree((d+1)%3,right), null);

        return t ;

}

4

4 回答 4

3

看起来问题不在于Collections.sort,而是您错过了列表大小在每一步都不会减小的场景。(特别是:如果列表的所有元素都相等会发生什么?)

堆栈溢出是由您的代码引起的,而不是Collections.sort.

于 2013-01-03T21:16:51.213 回答
1

您只需使用 -Xss 选项更改 VM 参数中的堆栈大小。

于 2013-01-03T20:51:07.337 回答
1

Collections.sort()根据 javadocs 用途a modified mergesort(这是一种递归算法)。在该算法的每次迭代中,都会进行递归调用,这会增加堆栈大小。

您必须使用-Xss选项增加堆栈大小或重新设计程序以使其工作。

于 2013-01-03T20:52:10.703 回答
0

你应该增加堆栈大小

java -Xss4m 程序

于 2013-01-03T20:54:05.637 回答