2013-01-03 49 views
2

我正在使用Collections.sort()列表中的大小100000和StackOverFlow錯誤。我怎樣才能擴展它?這裏是代碼:StackOverFlow錯誤,同時處理輸入的大小100000和更多

這是一個大項目的一部分。 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 ; 

}

+1

可能重複的[如何增加到Java堆棧大小?](http://stackoverflow.com/questions/3700459/how-to-increase-to-java-stack-size) – Jeffrey

+0

Collections.sort()應該在100000個項目列表中沒有問題。你確定問題不在其他地方嗎?你能發佈一個完整的例子嗎? – Alex

+0

這是一個大項目的一部分。 Collections.sort()在列表上按迭代方式調用,如下所示:列表大小在每一步都會減少,並且該過程會迭代,直到列表的大小變爲1爲止。 –

回答

3

它看起來像這個問題是不是在Collections.sort,那就是你缺少的場景,其中,列表大小在每一步都不會減少。 (具體來說:如果列表中的所有元素都相等會發生什麼?)

堆棧溢出是由您的代碼造成的,而不是由Collections.sort造成的。

+0

**「select」的一個很好的例子不是破解**從http://pragprog.com/the-pragmatic-programmer/extracts/tips – Alex

+0

謝謝。這是問題。 –

1

你只要使用-Xss選項更改VM參數中的堆棧大小。

1

Collections.sort()根據javadocs使用a modified mergesort(這是一個遞歸算法)。在該算法的每次迭代中,都會進行遞歸調用,從而增加堆棧大小。

您必須用-Xss選項增加堆棧大小或重新設計程序才能使其工作。

+0

即使Collections.sort以遞歸方式實現,堆棧大小將爲O(log(n)) - 不足以在100000個項目上堆疊堆棧。 – Alex

+0

@Alex可能你是對的。 100K不是導致「SOE」的大集合。 –

0

您應該增加堆棧大小

的Java -Xss4m計劃

+0

這沒有幫助。仍然得到相同的錯誤。 –