ProgramlamaBackend Geliştirici

Java'da Comparable ve Comparator arayüzleri arasındaki farkları açıklayın. Kullanıcı tanımlı nesnelerin sıralanmasında bunları nasıl düzgün bir şekilde uygulayabilir ve kullanabilirsiniz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Comparable — nesne sınıfı tarafından uygulanan bir arayüzdür. Doğal sıralama düzenini tanımlayan compareTo() metodunu belirler.

Comparatorcompare(o1, o2) metodunu uygulayan ayrı bir arayüzdür. Sınıfın kodunu değiştirmeden birden fazla sıralama yöntemini tanımlamanıza olanak tanır.

Ne zaman kullanılmalı:

  • Sınıfın mantıken yalnızca bir doğal sıralama yöntemi varsa — Comparable'ı uygulayın.
  • Birden fazla sıralama yöntemi desteği gerekiyorsa — ilgili Comparator'ları oluşturun.

Örnekler:

// Comparable class Student implements Comparable<Student> { String name; int grade; public int compareTo(Student other) { return this.grade - other.grade; } } // Comparator Comparator<Student> byName = new Comparator<Student>() { public int compare(Student s1, Student s2) { return s1.name.compareTo(s2.name); } }; List<Student> students = ...; Collections.sort(students); // grade'e göre sıralama Collections.sort(students, byName); // name'e göre sıralama

Kandırıcı Soru

Comparable'ı uygulamayan nesnelerin Listesini Comparator olmadan sıralamak mümkün mü?

Cevap: Hayır. Sınıf Comparable'ı uygulamıyorsa ve açıkça Comparator verilmemişse, koleksiyonu sıralama girişimi ClassCastException ile sonuçlanır.

Örnek:

class Animal {} List<Animal> animals = ...; Collections.sort(animals); // ClassCastException, eğer Comparable yoksa

Hikaye

Envanter projesinde Item sınıfı için Comparable'ı uygulamayı unuttum. Collections.sort(items) ile sıralama girişiminde bulundum. Sonuç olarak uygulama, compareTo() metodunun eksikliği nedeniyle sürekli ClassCastException ile çöktü.


Hikaye

Öğrencilerin değerlendirme servisinde, geliştirici yalnızca grade alanına göre compareTo() yönteminde karşılaştırma yaptı. Daha sonra isim ve doğum tarihine göre sıralama gerekti, ancak sınıf kodu yardımcı metodlarla genişledi, farklı Comparator kullanmak yerine karmaşık bir mantıkla compareTo() içinde sıralama yapıldı.


Hikaye

Çevrimiçi sipariş ürününde, siparişleri tarihe göre sıralamak için lambda ifadesi ile Comparator kullanmaya çalıştık, ancak tarih alanının null değerlerini göz önünde bulundurmayı unuttuk. Sonuç — teslimat tarihine sahip olmayan siparişlerin sıralanmasında beklenmedik NullPointerException'lar üretildi.