2013-05-04 2 views
5

lwjgl에서 실행되는이 재귀 적 BubbleSort 알고리즘을 게임에 추가했습니다. 나는이 클라우드의 속도 인 float로 "Cloud"객체의 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 클래스에서 comparable을 구현하는 것이 좋습니다. Collections.sort()가 처리하도록 컬렉션 (.size)을 유지하기 위해 컬렉션을 사용하고 있습니다. 그래도 자신의 방법을 발명하는 것은 재미 있습니다;) – arynaq

답변

9

을 할 Comparable를 구현해야합니다.

cl1.getSpeed() < cl2.getSpeed() 

이 거짓이므로 구름이 스왑되고 sort이 다시 호출됩니다. 이 호출에서

cl1.getSpeed() < cl2.getSpeed() 

은 여전히 ​​거짓이다, 그래서 당신은 다시 교환 및 sort를 호출합니다. 이것은 영원히 계속됩니다 (또는 스택이 가득 찰 때까지).

<에서 <=으로 변경하면 모든 것이 올바르게 작동합니다.

변경에 경우 - -

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

고마워요! – Deconimus

4

사용하기 위해 자바 Arrays.sort()에 배열에 대한 정렬 방법 내장 사용하는 것이 더 좋을 수도 이것은 당신이해야 할 일은 compare 메소드를 오버라이드하는 것이다. 여기 보이는 모양입니다.

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

또한 두 개의 연속적인 구름 같은 속도가있을 때 발생이

6

당신의 비교 로직 스택 오버플로는 재귀 함수가 올바른 종료 조건을 갖지 않을 때 발생하는 잘못된 재귀 호출이므로 영원히 자신을 호출하는 것으로 끝납니다. 귀하의 경우에는 '<'기호로 인해 종료 조건이 충족되지 않으므로 이것을 "< ="으로 변경해야합니다.

+0

두 가지 대답은 모두 정확합니다. 그러나 내장 된 정렬 방법을 사용하면 오류를 피하는 것이 더 나은 방법이며 사용 된 알고리즘은 버블 정렬보다 빠른 quicksort 또는 mergesort입니다. – aaronman

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

+0

이렇게하면 더 빠를 것입니다, 또한 정말로 재귀 호출이 필요하다고 생각하지 않습니다! 너의 문제를 알기에 어쨌든 반가워했다. – Akash

0

일반적인 원인으로 최적화 할 수 있습니다 그들은 같은 너무 경우이 클라우드 오브젝트를 건너 뛰어야