Menu
Coddy logo textTech

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
}
challenge icon

Görev

Kolay

Gö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: Bir name (String) ve priority (int, daha yüksek sayılar daha yüksek öncelik anlamına gelir) özelliklerine sahip bir yapılacak işi temsil eden Task sınıfını oluşturun. Göreviniz Comparable<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ıca toString() 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 ve Comparable arayü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. Listeyi sort() kullanarak sıralayın, boş bir satır yazdırın, ardından After 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, other nesnesinden önce geliyorsa negatif bir sayı
  • Eğer eşitlerse sıfır
  • Eğer this, other nesnesinden 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ır

Azalan 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
}
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