2015-06-28 32 views
5

Sıralanan bir listede çalışma İlkel uzun değerler için compareTo() işlevini uygulamak için gereken bir noktaya geldim.Etkili compareTo() ilkel uzun süre için

, bariz bir şekilde saf bir uygulama olup olmadığımı düşünmekteyim (), ancak bunu yapmak için zarif bir tek kodun (yeni bir Long (value) oluşturmadan) olup olmadığını merak ediyordum. Böyle

Belki bir şey:

@Override public int compareTo(MyClass that) { 
    return (int) ((value - that.value) >>> 32); 
} 

kimse bu işe yarar doğrulamak ve/veya başka bir uygulama önerebilirsiniz? Buna

cevap

10

Bir astar kodu:

int res = Long.compare(long x, long y) 

Kodunuz alışkanlık, tüm değerler için düzgün çalışması Integer.MIN_VALUE için denemek - Integer.MAX_VALUE ve alacak 1

+0

Bu, temelde '(x traveh

+1

@traveh Performansa göre dürüstlük derim. Ayrıca, yöntem zaten JDK tarafından zaten optimize edilmiş olabilir. –

+0

@ E_net4 Genel olarak katılıyorum ama argümanın iyiliği için performansın çok önemli olduğu özel bir durum olduğunu varsayalım. – traveh

1

Kişisel algoritma yanlıştır 0 döndürür olarak, 1 karşılaştırmak istedi ve 0 zaman:

Genelde
(1 - 0) >>> 32 
1 >>> 32 
0 

, Bence şube talimatlar olmadan uzun ürünler karşılaştırmak mümkündür emin değilim çünkü ikisinin farkı Uzunlar, taşma olmadan uzun süre sığmayabilir, bu farkın işaretini değiştirir.

Bu yüzden Evgeniy'in cevabını, JDK uygulamasını kullanmanın muhtemelen en iyi yaklaşım olduğuna katılıyorum.

İlgili konular