Comparable Arayüzü
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 72 / 110.
== iki nesnenin eşit olup olmadığını söylerken, bazen hangisinin önce geldiğini bilmeniz gerekir. Comparable arayüzü, doğal bir sıralama tanımlayarak nesnelerinizin sıralanmasını sağlar.
Bir sınıfı karşılaştırılabilir yapmak için Comparable<T> arayüzünü uygulayın ve compareTo metodunu geçersiz kılın. Bu metot; eğer this nesnesi other nesnesinden önce geliyorsa negatif bir sayı, eşitlerse sıfır ve this nesnesi sonra geliyorsa pozitif bir sayı döndürür:
class Student implements Comparable<Student> {
String name;
int grade;
Student(this.name, this.grade);
@override
int compareTo(Student other) {
return grade.compareTo(other.grade);
}
}
void main() {
var students = [
Student('Alice', 85),
Student('Bob', 92),
Student('Carol', 78),
];
students.sort();
for (var s in students) {
print('${s.name}: ${s.grade}');
}
// Carol: 78, Alice: 85, Bob: 92
}Sınıfınız Comparable arayüzünü uyguladığında, özel bir karşılaştırıcı sağlamadan sort() metodunu kullanabilirsiniz. Yerleşik sayısal ve dize türleri zaten Comparable arayüzünü uygular; bu nedenle grade.compareTo(other.grade) doğrudan çalışır.
Azalan sıralama için, nesneleri değiştirerek veya sonucu tersine çevirerek karşılaştırmayı tersine çevirmeniz yeterlidir:
@override
int compareTo(Student other) {
return other.grade.compareTo(grade); // Azalan
}Görev
KolayGörevlerin öncelik seviyelerine göre sıralanabildiği bir görev yönetim sistemi oluşturalım! Bir görev listesinin otomatik olarak en yüksekten en düşük önceliğe doğru sıralanmasını sağlayan, Comparable arayüzünü (interface) uygulayan bir Task sınıfı oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
task.dart: Birname(String) vepriority(int, daha yüksek sayılar daha yüksek öncelik anlamına gelir) özelliklerine sahip bir yapılacak işi temsil edenTasksınıfını oluşturun. GörevinizComparable<Task>arayüzünü uygulamalıdır, böylece sıralandığında görevler önceliğe göre azalan düzende (önce en yüksek öncelik) görünür. AyrıcatoString()metodunu şu formatı döndürecek şekilde geçersiz kılın (override):[name] (Priority: [priority])main.dart: Görev dosyanızı içe aktarın veComparablearayüzünün otomatik sıralamayı nasıl etkinleştirdiğini gösterin. Şu dört görevi içeren bir liste oluşturun:2önceliği ile'Write report'5önceliği ile'Fix critical bug'1önceliği ile'Update documentation'3önceliği ile'Review code'
Before sorting:yazdırın, ardından her bir görevi yazdırın. Listeyisort()kullanarak sıralayın, boş bir satır yazdırın, ardındanAfter sorting:ve sonrasında her bir görevi tekrar yazdırın.
Task sınıfınız Comparable arayüzünü uyguladığı için, özel bir karşılaştırıcı (comparator) sağlamadan liste üzerinde doğrudan sort() metodunu çağırabilirsiniz. Görevler, compareTo uygulamanıza göre otomatik olarak kendilerini düzenleyecektir!
Beklenen çıktı:
Before sorting:
Write report (Priority: 2)
Fix critical bug (Priority: 5)
Update documentation (Priority: 1)
Review code (Priority: 3)
After sorting:
Fix critical bug (Priority: 5)
Review code (Priority: 3)
Write report (Priority: 2)
Update documentation (Priority: 1)Kopya kağıdı
Comparable arayüzü, nesnelerin sıralama için doğal bir düzen tanımlamasına olanak tanır. Comparable<T> arayüzünü uygulayın ve compareTo metodunu geçersiz kılın (override).
compareTo metodu şunları döndürür:
- Eğer
this,othernesnesinden önce geliyorsa negatif bir sayı - Eğer eşitlerse sıfır
- Eğer
this,othernesnesinden sonra geliyorsa pozitif bir sayı
Temel uygulama (artan düzen):
class Student implements Comparable<Student> {
String name;
int grade;
Student(this.name, this.grade);
@override
int compareTo(Student other) {
return grade.compareTo(other.grade);
}
}Bir sınıf Comparable arayüzünü uyguladığında, özel bir karşılaştırıcı (comparator) olmadan sort() metodunu kullanabilirsiniz:
var students = [
Student('Alice', 85),
Student('Bob', 92),
Student('Carol', 78),
];
students.sort(); // Otomatik olarak compareTo metodunu kullanırAzalan düzen için karşılaştırmayı tersine çevirin:
@override
int compareTo(Student other) {
return other.grade.compareTo(grade); // Azalan
}Kendin dene
import 'task.dart';
void main() {
// TODO: Aşağıdakileri içeren bir Task nesneleri listesi oluşturun:
// - önceliği 2 olan 'Write report'
// - önceliği 5 olan 'Fix critical bug'
// - önceliği 1 olan 'Update documentation'
// - önceliği 3 olan 'Review code'
List<Task> tasks = [
// TODO: Dört görevi buraya ekleyin
];
// TODO: "Before sorting:" yazdırın
// TODO: Listedeki her bir görevi yazdırın
// TODO: sort() kullanarak listeyi sıralayın
// TODO: Boş bir satır yazdırın
// TODO: "After sorting:" yazdırın
// TODO: Sıralanmış listedeki her bir görevi yazdırın
}
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 DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarı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ıRepository Kalıbı