0Pricing
Java Academy · Ders

Comparable Arayüzü

Bir sınıfa doğal sıralama kazandırmak için Comparable uygulayın ve bunu Collections.sort ile kullanın.

Comparable Arayüzü, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Comparable Arayüzü

Comparable<T>, bir sınıfa doğal sıralama kazandırır. Sınıf örneklerini Collections.sort(), Arrays.sort() ve TreeSet gibi sıralı koleksiyonlarla sıralanabilir hâle getirmek için uygulayın.

Comparable Uygulama

compareTo(T other) yöntemini; negatif (this < other), sıfır (eşit) veya pozitif (this > other) değer döndürecek şekilde uygulayın.

class Product implements Comparable<Product> {
    private final String name;
    private final double price;

    Product(String name, double price) {
        this.name = name; this.price = price;
    }

    @Override
    public int compareTo(Product other) {
        return Double.compare(this.price, other.price); // ascending by price
    }

    @Override public String toString() { return name + "($" + price + ")"; }
}

List<Product> products = new ArrayList<>(List.of(
    new Product("Mouse", 29.99),
    new Product("Laptop", 999.0),
    new Product("Keyboard", 79.99)
));
Collections.sort(products);
System.out.println(products); // [Mouse($29.99), Keyboard($79.99), Laptop($999.0)]

compareTo Sözleşmesi

Comparable'ı doğru şekilde uygulamak için bir sözleşmenin koşullarını karşılamanız gerekir:

  • Karşıt simetri: sgn(a.compareTo(b)) == -sgn(b.compareTo(a))
  • Geçişlilik: a > b ve b > c ise a > c olmalıdır
  • Tutarlılık: a.compareTo(b) == 0 ise a.equals(b) olması önemle önerilir

İlkel Türleri Güvenle Karşılaştırma

compareTo içinde ilkel değerleri asla çıkarmayın; tamsayı taşması yanlış sonuçlar verebilir. Integer.compare(), Double.compare() ve benzeri yöntemleri kullanın.

// WRONG: integer subtraction can overflow
int compareTo(Player other) {
    return this.score - other.score; // overflow if scores differ by > Integer.MAX_VALUE
}

// CORRECT: use Integer.compare
int compareTo(Player other) {
    return Integer.compare(this.score, other.score);
}

// For strings: delegate to String.compareTo
int compareTo(Player other) {
    return this.name.compareTo(other.name); // String handles it correctly
}

TreeSet'te Doğal Sıralama

Comparable uygulayan sınıflar, TreeSet ve TreeMap gibi sıralı koleksiyonlara otomatik olarak yerleştirilir.

class Priority implements Comparable<Priority> {
    enum Level { LOW, MEDIUM, HIGH, CRITICAL }
    final Level level;
    final String task;
    Priority(Level level, String task) { this.level = level; this.task = task; }
    @Override
    public int compareTo(Priority other) {
        return this.level.compareTo(other.level); // enum ordinal order
    }
    @Override public String toString() { return level + ": " + task; }
}

TreeSet<Priority> queue = new TreeSet<>();
queue.add(new Priority(Priority.Level.CRITICAL, "Fix prod crash"));
queue.add(new Priority(Priority.Level.LOW, "Update docs"));
queue.add(new Priority(Priority.Level.HIGH, "Deploy feature"));
queue.forEach(System.out::println);
// LOW: Update docs
// HIGH: Deploy feature
// CRITICAL: Fix prod crash

Birden Çok Alanla Comparable

Birden çok alana göre sıralamak için karşılaştırmaları zincirleyin: birincil alanı, birincil alan eşitse ikincil alanı karşılaştırın.

class Employee implements Comparable<Employee> {
    final String dept, name;
    final double salary;

    Employee(String dept, String name, double salary) {
        this.dept = dept; this.name = name; this.salary = salary;
    }

    @Override
    public int compareTo(Employee other) {
        int deptCmp = this.dept.compareTo(other.dept);
        if (deptCmp != 0) return deptCmp;           // primary: by dept
        return this.name.compareTo(other.name);      // secondary: by name
    }
}

Comparable ve equals Tutarlılığı

a.compareTo(b) == 0 iff a.equals(b) olması önemle önerilir, ancak zorunlu değildir. Bu kuralın ihlali, sıralı kümelerde ve eşlemelerde fark edilmesi zor hatalara yol açar.

// BigDecimal violates this: new BigDecimal("2.0").compareTo(new BigDecimal("2.00")) == 0
// but new BigDecimal("2.0").equals(new BigDecimal("2.00")) == false

// This causes TreeSet to treat them as equal (only one stored)
TreeSet<java.math.BigDecimal> set = new TreeSet<>();
set.add(new java.math.BigDecimal("2.0"));
set.add(new java.math.BigDecimal("2.00"));
System.out.println(set.size()); // 1 — compareTo-equal → same element

Collections.sort ile Sıralama

Collections.sort() ve Arrays.sort(), Comparable tarafından tanımlanan doğal sıralamayı kullanır.

List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
Collections.sort(names); // natural alphabetical order
System.out.println(names); // [Alice, Bob, Charlie]

String[] arr = {"banana", "apple", "cherry"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [apple, banana, cherry]

// Stream sorted() uses natural order
names.stream().sorted().forEach(System.out::println);

İkili Aramada Comparable

Collections.binarySearch(), listenin doğal sıraya göre sıralanmış olmasını ve öğelerin Comparable uygulamasını gerektirir.

List<Integer> sorted = new ArrayList<>(List.of(1, 3, 5, 7, 9, 11));
int idx = Collections.binarySearch(sorted, 7);
System.out.println("Found 7 at index: " + idx); // 3

int missing = Collections.binarySearch(sorted, 4);
System.out.println("4 not found, insertion point: " + (-missing - 1)); // 2

Comparable ve Comparator Karşılaştırması

Temel ayrım:

  • Comparable: sınıfın kendi doğal sıralamasını tanımlar; sınıf başına bir tane
  • Comparator: dışarıdan bir sıralama tanımlar; sınırsız sayıda oluşturulabilir ve birleştirilebilir

Uygulama: Liderlik Tablosu

Doğal olarak puanları azalan sırada sıralayan Comparable kullanan bir liderlik tablosu.

class LeaderboardEntry implements Comparable<LeaderboardEntry> {
    final String player;
    final int score;
    final long timestamp;

    LeaderboardEntry(String player, int score) {
        this.player = player; this.score = score;
        this.timestamp = System.nanoTime();
    }

    @Override
    public int compareTo(LeaderboardEntry other) {
        int scoreCmp = Integer.compare(other.score, this.score); // descending
        if (scoreCmp != 0) return scoreCmp;
        return Long.compare(this.timestamp, other.timestamp); // earlier = higher
    }

    @Override public String toString() { return player + ": " + score; }
}

TreeSet<LeaderboardEntry> board = new TreeSet<>();
board.add(new LeaderboardEntry("Alice", 950));
board.add(new LeaderboardEntry("Bob", 1200));
board.add(new LeaderboardEntry("Carol", 950));
board.forEach(System.out::println);
// Bob: 1200 / Alice: 950 / Carol: 950

Hızlı Denetim

Geçerli nesne bağımsız değişkenden küçük olduğunda compareTo() ne döndürür?

Özet: Comparable Arayüzü

Temel çıkarımlar:

  • Bir sınıfın doğal sıralamasını tanımlamak için Comparable<T> uygulayın
  • compareTo negatif (küçük), sıfır (eşit) veya pozitif (büyük) değer döndürür
  • Integer.compare()/Double.compare() kullanın; asla çıkarma yapmayın (taşma riski)
  • Birden çok alanla sıralama için karşılaştırmaları zincirleyin: birincil → ikincil
  • Doğal sıra Collections.sort, Arrays.sort, TreeSet ve TreeMap tarafından kullanılır
  • Comparable ONE sıralama tanımlar; birden çok sıralama için Comparator kullanın

Sıkça Sorulan Sorular

“Comparable Arayüzü” dersi ücretsiz mi?

Evet — “Comparable Arayüzü” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Comparable Arayüzü” dersinde ne öğreneceğim?

Bir sınıfa doğal sıralama kazandırmak için Comparable uygulayın ve bunu Collections.sort ile kullanın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Comparable Arayüzü” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Comparable Arayüzü
  2. Comparator ve Lambda ile Sıralama
  3. thenComparing ile Çok Anahtarlı Sıralama
  4. Dizileri ve Koleksiyonları Uygulamada Sıralama
← Java Academy Sayfasına Dön