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 kendi doğal sıralamalarını tanımlamaları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 metot uygulamanızı gerektirir: compareTo(). Bu metot, mevcut nesneyi başka bir nesneyle karşılaştırır ve bunların göreceli sırasını belirten bir tam sayı 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 this.age - other.age; // Yaşa göre artan sırada sırala
}
}Uygulandıktan sonra sıralama işlemi oldukça basit hale gelir:
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, AliceDizeleri veya diğer Comparable alanları karşılaştırmak için, çıkarma işlemi kullanmak yerine bunların compareTo() yöntemine devredebilirsiniz: return this.name.compareTo(other.name);. Bu yaklaşım daha güvenlidir ve uç durumları düzgün bir şekilde ele alır.
Görev
KolayFilmleri derecelendirmelerine göre sıralamak için Comparable arayüzünü kullanan bir film sıralama sistemi oluşturalım. Kendisini diğer filmlerle nasıl karşılaştıracağını bilen bir Movie sınıfı oluşturacaksınız; bu, en yüksekten en düşüğe doğru otomatik sıralama yapılmasını sağlayacaktır.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Movie.java: Diğer filmlerle karşılaştırılabilen bir filmi temsil eden bir sınıf oluşturun. Bir Movie nesnesinin üç özel (private) alanı vardır:title(String),director(String) verating(double, 0.0 ile 10.0 arası). Tüm alanları başlatan bir yapıcı (constructor) ve her biri için getter metotları ekleyin.Movie sınıfınızın
Comparable<Movie>arayüzünü uygulamasını (implement) sağlayın vecompareTo()metodunu geçersiz kılın (override). Filmler, derecelendirmeye göre azalan düzende (en yüksek dereceli olan ilk sırada) sıralanmalıdır. Double değerleri karşılaştırırken, güvenli karşılaştırma içinDouble.compare()kullanın; azalan sıralama için sırayı tersine çevirmeyi unutmayın!toString()metodunu şu formatı döndürecek şekilde geçersiz kılın:[title] by [director] - Rating: [rating]Main.java: Bir film listesi oluşturup bunları sıralayarak Movie sınıfınızı hayata geçirin. Her biri ayrı bir satırda ve şu formatta olmak üzere üç film için girdi alacaksınız:title,director,ratingMovie nesneleri oluşturmak için her satırı ayrıştırın, bunları bir
ArrayListiçine ekleyin ve ardından listeyi sıralamak içinCollections.sort()kullanın.Comparableuygulamanız sayesinde filmler derecelendirmeye göre otomatik olarak sıralanacaktır!Sıralamadan sonra, her filmi
toString()formatını kullanarak kendi satırına yazdırın. En yüksek puanlı film ilk sırada görünmelidir.
Her biri şu formatta film verisi içeren üç satır girdi alacaksınız: title,director,rating
Örneğin, bir girdi satırı şöyle görünebilir: Inception,Christopher Nolan,8.8
Main dosyanızda java.util.ArrayList, java.util.Collections ve java.util.Scanner sınıflarını içe aktarmayı (import) unutmayın. Comparable arayüzünü uygulamanın, özel nesnelerinizi tek bir metot çağrısıyla nasıl sıralamanıza olanak tanıdığına dikkat edin; ekstra bir comparator gerekmez!
Kopya kağıdı
Comparable arayüzü, nesnelerin otomatik sıralama için kendi doğal sıralamalarını tanımlamalarına olanak tanır.
Şu değerleri döndüren compareTo() metodunu uygulayın:
- Negatif değer: bu nesne diğerinden önce gelir
- Sıfır: her iki nesne eşittir
- Pozitif değer: bu nesne diğerinden sonra gelir
public class Person implements Comparable<Person> {
private int age;
@Override
public int compareTo(Person other) {
return this.age - other.age; // Yaşa göre artan sırada sırala
}
}Nesneleri Collections.sort() kullanarak sıralayın:
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people); // Yaşa göre sıralandıDizeleri (string) karşılaştırmak için, onların compareTo() metoduna devredin:
return this.name.compareTo(other.name);Double değerleri güvenli bir şekilde karşılaştırmak için Double.compare() kullanın:
return Double.compare(this.rating, other.rating); // Artan
return Double.compare(other.rating, this.rating); // AzalanKendin 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ırlık film verisini oku
String line1 = scanner.nextLine();
String line2 = scanner.nextLine();
String line3 = scanner.nextLine();
// TODO: Movie nesnelerini saklamak için bir ArrayList oluşturun
// TODO: Her satırı ayrıştırın (format: title,director,rating)
// İpucu: Parçaları ayırmak için split(",") kullanın
// İpucu: Derecelendirme (rating) için Double.parseDouble() kullanın
// TODO: Movie nesneleri oluşturun ve bunları listeye ekleyin
// TODO: Collections.sort() kullanarak listeyi sıralayın
// TODO: Her filmi yazdırın (her satıra bir tane)
}
}
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ı