2013-05-04 20 views
5

Bu yinelemeli BubbleSort algoritmasını lwjgl üzerinde çalışan oyunuma ekledim. Bu bulutun hızı olan bir kayan nokta tarafından bir "ArrayList" "Bulut" nesnesini sıralamaya çalışıyorum.BubbleSort StackOverflowError

Bazı nedenlerden dolayı bazen kendi içinde bir yöntemi "java.lang.StackOverflowError" alıyorum. İşte

kod:

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

Ve burada hatalar alıyorum gibidir:

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

Bulut sınıfınızda karşılaştırılabilir bir uygulama yapmanızı öneririm, size (.size) görünen bulutları tutmak için bir koleksiyon kullanıyorsunuzdur, bu yüzden Collections.sort() sizin için önemli olacaktır. Kendi yöntemlerini icat olsa da eğlencelidir;) – arynaq

cevap

9

yapmak Karşılaştırılabilir uygulamalıdır.

cl1.getSpeed() < cl2.getSpeed() 

yanlış, yani bulutlar değiştirilecek ve sort tekrar denir. Bu görüşme olarak,

cl1.getSpeed() < cl2.getSpeed() 

hala yanlıştır, böylece tekrar takas ve sort arayın. Bu sonsuza kadar devam eder (veya daha iyisi: yığının dolmasına kadar).

< değerini <= olarak değiştirin ve her şey iyi çalışmalıdır.

Değişim eğer - -

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

Şimdi çalışıyor! – Deconimus

4

Kullanımı java Arrays.sort() dizilere Sıralama stilini inşa kullanmak daha iyi olabilir Yapmanız gereken tek şey, karşılaştırmayı yönteme göre geçersiz kılmaktır. İşte göründüğü gibi.

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

Ayrıca iki ardışık bulutlar aynı hıza sahip ne olur bu

6

Sen karşılaştırma mantığı yığın taşması, özyinelemeli işlevleriniz doğru sonlandırma koşuluna sahip olmadığı zaman ortaya çıkan kötü bir özyinelemeli bir çağrıdır, bu nedenle her zaman için kendini çağırır. Durumunuzda, "<" işareti nedeniyle sonlandırma koşulu yerine getirilmediğinden, bunu "< =" olarak değiştirmelisiniz.

+0

Diğer iki cevap doğrudur, ancak yerleşik sıralama yöntemini kullanırsanız, hatalardan kaçınmak için daha iyi bir yöntemdir ve kullanılan algoritma muhtemelen hızlı bir şekilde daha hızlıdır veya kabarcık sıralamadan daha hızlı olan mergesorttur ( – aaronman

0

Ayrıca bir için

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

). Ama cevap için teşekkürler. – Deconimus

+0

bunu yapmak daha hızlı olurdu, ayrıca bunun için tekrarlayıcı bir çağrı yapmanız gerektiğini düşünmüyorum! Neyse sorununuzu tanımak güzeldi – Akash

0

Ortak nedeni olarak optimize edilebilir aynı da ise iki bulut nesneleri atlaması gereken