Java BubbleSort堆栈溢出错误

Java BubbleSort堆栈溢出错误,java,sorting,arraylist,stack-overflow,Java,Sorting,Arraylist,Stack Overflow,我在运行lwjgl的游戏中添加了这个递归BubbleSort算法。我试图用一个浮点数对“云”对象的ArrayList进行排序,这个浮点数是云的速度 出于某种原因,有时在调用方法本身的行中会出现“java.lang.StackOverflowerError” 代码如下: public void sort() { for (int i = 0; i < clouds.size() - 1; i++) { Cloud cl1 = clouds.get(i);

我在运行lwjgl的游戏中添加了这个递归BubbleSort算法。我试图用一个浮点数对“云”对象的ArrayList进行排序,这个浮点数是云的速度

出于某种原因,有时在调用方法本身的行中会出现“java.lang.StackOverflowerError”

代码如下:

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();
    }
}

对于java
arrays.sort()
中的数组,最好使用内置的sort方法。要使用此方法,只需重写compare to方法。这是它的样子

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

您还必须执行类似的操作,以在两个连续云具有相同速度时执行此操作

cl1.getSpeed() < cl2.getSpeed()
仍然为false,因此再次交换并调用
sort
。这种情况会一直持续下去(或者更好:直到堆满为止)


更改
如果两个云对象相同,比较逻辑应该跳过它们-

换成-

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

if(cl1.getSpeed()它可以进一步优化为

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();
}
public void sort(){
布尔交换=假;
对于(int i=0;iif(cl1.getSpeed()堆栈溢出的常见原因是错误的递归调用,这是在递归函数没有正确的终止条件时导致的,因此它会永远调用自己。在您的情况下,终止条件不满足,因为“我建议在您的云类中实现comparable”,您使用的是collsection来保存云,看起来(.size),所以Collections.sort()会为您处理它。不过,发明自己的方法很有趣;)其他两个答案都是正确的,但是如果你使用内置的排序方法,这是一个更好的避免错误的实践,使用的算法可能是快速排序或合并排序,它比冒泡排序更快,所以会更快,而且我真的不认为你需要为此进行递归调用!无论如何,很高兴知道你的问题已经解决
if (cl1.getSpeed() <= cl2.getSpeed()) {
    continue;
}
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();
}