Comparator Arayüzü
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 45 / 87.
Comparable bir sınıfın doğal sıralamasını tanımlarken, bazen nesneleri farklı şekillerde sıralamanız gerekir. Comparator arayüzü, özgün sınıfı değiştirmeden ayrı karşılaştırma mantığı oluşturmanıza olanak tanır.
Comparator, aynı türdeki iki nesneyi karşılaştıran harici bir nesnedir. Bu, birden fazla sıralama seçeneği istediğinizde veya sınıfın kendisini değiştiremediğinizde kullanışlıdır:
import java.util.Comparator;
class NameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}Ardından karşılaştırıcıyı sıralama yöntemlerine aktarabilirsiniz:
List<Person> people = new ArrayList<>();
people.add(new Person("Charlie", 30));
people.add(new Person("Alice", 25));
Collections.sort(people, new NameComparator()); // İsme göre sıralandı
Collections.sort(people, new AgeComparator()); // Yaşa göre sıralandıKısa ve öz kod için, Comparator işlevsel bir arayüz olduğundan lambda ifadelerini kullanabilirsiniz:
Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));Temel fark: Comparable, karşılaştırılan sınıf tarafından uygulanır ve tek bir doğal sıralama tanımlar; Comparator ise sınırsız sayıda özel sıralama tanımlayabilen ayrı bir sınıftır.
Görev
KolayComparator arayüzünün gücünü gösteren bir çalışan sıralama sistemi oluşturalım. Employee sınıfının kendisini değiştirmeden, çalışanları maaşa ve ada göre farklı şekillerde sıralamak için birden fazla karşılaştırıcı oluşturacaksın.
Kodunu dört dosya arasında düzenleyeceksin:
Employee.java: Üç private alana sahip bir çalışanı temsil eden bir sınıf oluştur:name(String),department(String) vesalary(double). Tüm alanları başlatmak için bir oluşturucu ve her alan için getter metotları ekle.toString()metodunu, şunu döndürecek şekilde geçersiz kıl:[name] ([department]) - $[salary]SalaryComparator.java: Çalışanları maaşa göre azalan sırada (en yüksek maaşlı ilk sırada) sıralayan bir karşılaştırıcı oluştur.Comparator<Employee>arayüzünü ve onuncompare()metodunu uygula. Maaş değerlerini güvenli bir şekilde karşılaştırmak içinDouble.compare()kullan.NameComparator.java: Çalışanları ada göre alfabetik olarak artan sırada (A'dan Z'ye) sıralayan başka bir karşılaştırıcı oluştur.Comparator<Employee>arayüzünü uygula ve karşılaştırma için String'incompareTo()metodunu kullan.Main.java: Çalışanlardan oluşan bir liste oluşturup karşılaştırıcılarını kullanarak sıralayarak her şeyi bir araya getir. Her biri ayrı bir satırda olmak üzere üç çalışan için şu biçimde girdi alacaksın:name,department,salaryÇalışanlardan oluşan bir
ArrayListoluştur, ardından her iki sıralama yaklaşımını göster:- Önce kendi
SalaryComparatorsınıfını kullanarak maaşa göre sırala ve her çalışanı yazdır - Boş bir satır yazdır
- Ardından kendi
NameComparatorsınıfını kullanarak ada göre sırala ve her çalışanı yazdır
- Önce kendi
Her biri şu biçimde çalışan verileri içeren üç satır girdi alacaksın: name,department,salary
Örneğin, bir girdi satırı şöyle görünebilir: Alice,Engineering,75000.0
Karşılaştırıcı dosyalarına java.util.Comparator ve Main dosyana java.util.ArrayList, java.util.Collections ve java.util.Scanner içe aktarmayı unutma. Karşılaştırıcıların birden fazla sıralama stratejisini harici olarak tanımlamana nasıl olanak sağladığına dikkat et: Employee sınıfının nasıl sıralanabileceği hakkında herhangi bir şey bilmesi gerekmez!
Kendin dene
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdiden üç çalışan oku
// Her satır formatı: name,department,salary
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Her satırı ayrıştır ve Employee nesneleri oluştur
// Hint: Değerleri ayırmak için split(",") kullan
// TODO: Çalışanlardan bir ArrayList oluştur ve üçünü de ekle
// TODO: SalaryComparator kullanarak maaşa göre sırala ve her çalışanı yazdır
// Hint: Collections.sort(list, comparator) kullan
// TODO: Boş bir satır yazdır
// TODO: NameComparator kullanarak isme göre sırala ve her çalışanı yazdır
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi