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, AliceString'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.
Görev
KolayFilmleri 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) verating(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 vecompareTo()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çinDouble.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,ratingHer satırı ayrıştırarak Movie nesneleri oluştur, bunları bir
ArrayList'e ekle, ardından listeyi sıralamak içinCollections.sort()kullan.Comparableuygulaman 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)
}
}
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