2013-05-04 75 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

为共同的事业优化堆栈溢出是一种不好的递归调用,当递归函数没有正确的终止条件时会引发这种递归调用,所以它最终会永远调用它自己。在你的情况下,由于严格的'<'符号而不能满足终止条件,所以你必须将它改为“< =”就是这样。