Menu
Coddy logo textTech

compareTo() ve Comparable

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 44 / 87.

Comparable arayüzü, nesnelerin doğal sıralamalarını tanımlamasına olanak tanır. Bu arayüzü uygulayarak sınıfınız, Collections.sort() gibi yöntemler kullanılarak otomatik olarak sıralanabilir veya TreeSet gibi sıralı koleksiyonlarda saklanabilir.

Arayüz, tek bir yöntemi uygulamanızı gerektirir: compareTo(). Bu yöntem, geçerli nesneyi başka bir nesneyle karşılaştırır ve göreli sıralarını belirten bir tamsayı döndürür:

  • Negatif değer: bu nesne diğerinden önce gelir
  • Sıfır: her iki nesne de eşittir
  • Pozitif değer: bu nesne diğerinden sonra gelir
public class Person implements Comparable<Person> {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);  // Yaşa göre artan sırada sırala
    }
}

Uygulandıktan sonra sıralama kolaylaşır:

List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people);  // Şimdi yaşa göre sıralandı: Bob, Alice

String'leri veya diğer Comparable alanları karşılaştırırken çıkarma kullanmak yerine bunların compareTo() metoduna başvurabilirsiniz: return this.name.compareTo(other.name);. Bu yaklaşım daha güvenlidir ve uç durumları doğru şekilde ele alır. int alanları için a - b yerine Integer.compare(a, b) kullanmayı tercih edin; çünkü çıkarma, uç değerlerde taşmaya neden olabilir.

challenge icon

Görev

Kolay

Filmleri puanlarına göre sıralamak için Comparable arayüzünü kullanan bir film sıralama sistemi oluşturalım. Kendini diğer filmlerle nasıl karşılaştıracağını bilen bir Movie sınıfı oluşturacaksın; böylece filmler en yüksek puandan en düşüğe doğru otomatik olarak sıralanabilecek.

Kodunu iki dosya arasında düzenleyeceksin:

  • Movie.java: Diğer filmlerle karşılaştırılabilen bir filmi temsil eden bir sınıf oluştur. Bir Movie sınıfının üç private alanı vardır: title (String), director (String) ve rating (double, 0.0 ile 10.0 arasında). Tüm alanları başlatan bir constructor ve her alan için getter metotları ekle.

    Movie sınıfının Comparable<Movie> arayüzünü uygulamasını sağla ve compareTo() metodunu override et. Filmler puana göre azalan sırada (en yüksek puanlı ilk olacak şekilde) sıralanmalıdır. Double değerlerini karşılaştırırken güvenli karşılaştırma için Double.compare() kullan: azalan sıralama için sırayı tersine çevirmeyi unutma!

    toString() metodunu override ederek şunu döndürmesini sağla: [title] by [director] - Rating: [rating]

  • Main.java: Bir film listesi oluşturup filmleri sıralayarak Movie sınıfını kullan. Her biri ayrı bir satırda olmak üzere üç film için şu biçimde girdi alacaksın: title,director,rating

    Her satırı ayrıştırarak Movie nesneleri oluştur, bunları bir ArrayList'e ekle, ardından listeyi sıralamak için Collections.sort() kullan. Comparable uygulaman sayesinde filmler puanlarına göre otomatik olarak sıralanacak!

    Sıralamadan sonra her filmi toString() biçimini kullanarak kendi satırına yazdır. En yüksek puanlı film ilk sırada görünmelidir.

Her biri title,director,rating biçiminde film verileri içeren üç girdi satırı alacaksın.

Örneğin, bir girdi satırı şöyle görünebilir: Inception,Christopher Nolan,8.8

Main dosyana java.util.ArrayList, java.util.Collections ve java.util.Scanner sınıflarını import etmeyi unutma. Comparable uygulamanın, özel nesnelerini tek bir metot çağrısıyla sıralamana nasıl olanak tanıdığına dikkat et: ek bir karşılaştırıcıya gerek yok!

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);
        
        // Üç satır film verisi oku
        String line1 = scanner.nextLine();
        String line2 = scanner.nextLine();
        String line3 = scanner.nextLine();
        
        // TODO: Movie nesnelerini saklamak için bir ArrayList oluştur
        
        // TODO: Her satırı ayrıştır (format: title,director,rating)
        // İpucu: Parçaları ayırmak için split(",") kullan
        // İpucu: Derecelendirme için Double.parseDouble() kullan
        
        // TODO: Movie nesneleri oluştur ve listeye ekle
        
        // TODO: Collections.sort() kullanarak listeyi sırala
        
        // TODO: Her filmi yazdır (her satıra bir tane)
    }
}
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