Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Comparator 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) ve salary (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 onun compare() metodunu uygula. Maaş değerlerini güvenli bir şekilde karşılaştırmak için Double.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'in compareTo() 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 ArrayList oluştur, ardından her iki sıralama yaklaşımını göster:

    1. Önce kendi SalaryComparator sınıfını kullanarak maaşa göre sırala ve her çalışanı yazdır
    2. Boş bir satır yazdır
    3. Ardından kendi NameComparator sınıfını kullanarak ada göre sırala ve her çalışanı yazdır

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
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi