2013-05-04 41 views
5

我將此遞歸BubbleSort算法添加到我在lwjgl上運行的遊戲中。我試圖用一個浮點數來排序「雲」對象的ArrayList,這是這​​個雲的速度。BubbleSort StackOverflowError

出於某種原因,有時我會在我調用本身的方法的行處得到一個「java.lang.StackOverflowError」。

下面的代碼:

public void sort() { 
    for (int i = 0; i < clouds.size() - 1; i++) { 
     Cloud cl1 = clouds.get(i); 
     Cloud cl2 = clouds.get(i + 1); 
     if (cl1.getSpeed() < cl2.getSpeed()) { 
      continue; 
     } 
     clouds.set(i, cl2); 
     clouds.set(i+1, cl1); 
     this.sort(); 
    } 
} 

,這裏是我得到的錯誤:

Sat May 04 20:28:45 CEST 2013 ERROR:null 
java.lang.StackOverflowError 
     at backgrounds.Clouds.sort(Clouds.java:224) 
[...] // The line above is repeated for some hundred times. 
+0

我推薦在你的Cloud類中實現可比較的,你使用一個集合來保存它看起來像的雲(.size),所以Collections.sort()會爲你處理它。發明自己的方法雖然很有趣;) – arynaq 2013-05-04 18:55:20

回答

9

,當兩個連續的雲有相同的速度發生。

cl1.getSpeed() < cl2.getSpeed() 

是錯誤的,雲被交換,sort被再次調用。在這一號召,

cl1.getSpeed() < cl2.getSpeed() 

仍然是假的,所以你再交換和呼叫sort。這一直持續下去(或者更好:直到堆滿)。

更改<<=和一切應該正常工作。

+0

感謝它現在的工作! – Deconimus 2013-05-04 18:56:15

4

這可能是更好的使用內置的排序方法對數組在Java中Arrays.sort()使用這一切你必須做的是重寫比較方法。這是它的外觀。

@Override 
public int compareTo(Book other) { 
//compare logic here 
} 

還必須實現媲美做到這一點

6

你比較邏輯應該空兩名雲對象,如果它們是相同的太 -

改變,如果以 -

if (cl1.getSpeed() <= cl2.getSpeed()) { 
    continue; 
} 
+0

其他的答案都是正確的,但是如果你使用內置的排序方法,避免錯誤是一個更好的做法,所用的算法可能是快速排序或合併排序,這比排序快於排序 – aaronman 2013-05-04 18:56:18

0

可以進一步爲

public void sort() { 
    boolean swaps = false; 
    for (int i = 0; i < clouds.size() - 1; i++) { 
     Cloud cl1 = clouds.get(i); 
     Cloud cl2 = clouds.get(i + 1); 
     if (cl1.getSpeed() <= cl2.getSpeed()) { 
      continue; 
     } 
     swaps = true; 
     clouds.set(i, cl2); 
     clouds.set(i+1, cl1); 
    } 

    //Re-Iterate all the elements only if a swap is found 
    if(swaps) 
     this.sort(); 
} 
+0

我認爲這正在發生。但是謝謝你的回答。 – Deconimus 2013-05-04 19:05:53

+0

這樣做會更快,我真的不認爲你需要爲此做一個遞歸調用!無論如何高興地知道你的問題解決了 – Akash 2013-05-04 19:23:13

0

爲共同的事業優化堆棧溢出是一種不好的遞歸調用,當遞歸函數沒有正確的終止條件時會引發這種遞歸調用,所以它最終會永遠調用它自己。在你的情況下,由於嚴格的'<'符號而不能滿足終止條件,所以你必須將它改爲「< =」就是這樣。