2016-03-20 20 views
4

Nesneleri Y koordinatlarına dayalı, karşılaştırılabilir bir sınıf kullanarak, değişen Y değerlerine göre sıralayan bir izometrik oyun yazıyorum. "Karşılaştırma yöntemi genel sözleşmesini ihlal ediyor" hatasını alıyorum! ve negatif bir sayı, 0, ya da ben öyle bu uygulayan pozitif bir sayı dönmek konusunda okudum:Java Karşılaştırılabilir Sınıf - Karşılaştırma yöntemi, genel sözleşmesini ihlal ediyor

public boolean equals(Entity e) { 
    if ((e.y-y)==0) 
     return (e.id == id); 
    return (e.y == y); 
} 

public int compareTo(Entity e) { 
    if ((e.y-y)==0) 
     return (e.id - id); 
    return (int) (e.y - y); // Render order by y coordinate 
} 

Ama hala hata alıyorum. Değerler değişirse veya başka bir şey yanlış mı yapıyorum diye sıralama çalışmaz mı?

+0

'y 'alanınız ne tür? –

+0

y şamandıralı tip –

+0

Bu istisna mesajıyla ilgili çok sayıda soru var zaten. Göndermeden önce ara. Sorunuzun, önceki sorulardan birinin kopyası olmadığını gösterin. – Raedwald

cevap

7

equals yöntemi sözleşmede yer almıyor, dolayısıyla onu yok sayabiliriz.

Sorunun tamsayı taşması nedeniyle meydana geldiğinden şüpheleniyorum. Sorun,'un x > y ve x < y ise negatif bir sayı olması durumunda size her zaman olumlu bir cevap vermemesidir. Sayılar arasındaki fark yeterince büyükse, o zaman ifade x - y taşacak ve sonuç yanlış işarete sahip olacaktır. Bu sorun ise

ardından basit bir çözüm başka olasılık kişiler (örneğin) gibi aynı zamanda onları tasnif mutasyona uğramış ediliyor olmasıdır yerine x - y

ait Integer.compare(x, y) kullanmaktır.


Float.compare (x, y) daha iyi çalışmıştır.

Ben x ve yint olduklarını kabul etmişti. float ise, sorunun gerçek sebebi anlamak daha zordur. Her iki durumda da Float.compare(x, y) kullanımı daha iyi bir çözümdür.

Ama x ve y aslında int ise, o zaman Float.compare(x, y) kullanarak bazı x ve y değerler için yanlış cevaplar verecektir

. x ve y ve y arasındaki yakın değerler için int - float dönüşümü hassasiyeti kaybedecek ve Float.compare eşit olduklarını söyleyecektir.

+0

Tamamen haklısınız. Bunu daha önce neden görmediğimi bilmiyorum. Y değerleri hem pozitif hem de her ikisi de negatif veya her biri olabilir ve farklı sonuçlar verebilir. Float.compare (x, y) çok daha iyi çalıştı. Yardımın için çok teşekkürler! –

İlgili konular