CodeBlanks Logo Icon CodeBlanks

Görev tamamlama

completeTask ile görev durumunu güncellemeyi öğrenirsin.

Görev tamamlama: completeTask ve copy

Bir görevi tamamlamak için completeTask(title) metodu, listede başlığı eşleşen görevi bulup done'ı true yapar. Task veri sınıfı değişmez (immutable) olduğundan, copy(done = true) ile yeni bir kopya oluşturup listedeki yeriyle değiştiririz.

fun completeTask(title: String) {
    val i = tasks.indexOfFirst { it.title == title }
    if (i >= 0) {
        tasks[i] = tasks[i].copy(done = true)
    }
}

indexOfFirst { } koşula uyan ilk indeksi verir; yoksa -1. i >= 0 denetimi, yalnızca görev bulunduysa güncelleme yapmayı sağlar.

indexOfFirst ve bulunamayan görev

indexOfFirst { koşul } koşula uyan ilk elemanın indeksini verir; hiçbiri uymazsa -1 döner. Bu davranış, completeTask'ın olmayan bir başlık çağrıldığında sessizce hiçbir şey yapmasını sağlar.

val i = tasks.indexOfFirst { it.title == "Yok" }
// i = -1; if (i >= 0) bloğu çalışmaz

Bu "sessiz sessizce geç" yaklaşımı, CLI'da kullanıcı yanlış başlık yazdığında uygulamanın çökmemesini sağlar. İstersen "görev bulunamadı" mesajı da ekleyebilirsin.

Uygulama completeTask metodunu ekle ve çağır

TodoList'e fun completeTask(title: String) metodunu ekle: val i = tasks.indexOfFirst { it.title == title } ile bul, if (i >= 0) bloğunda tasks[i] = tasks[i].copy(done = true) yap. main içinde iki görev ekle, completeTask("Ödev") çağır ve listTasks() ile yazdır.

Başlangıç kodu

Main.kt
fun main() {
    val list = TodoList()
    list.addTask("Alışveriş")
    list.addTask("Ödev")
    // "Ödev"i tamamla ve listTasks ile yazdır
}

// Task ve TodoList sınıfları önceki derslerde tanımlandığı gibi durur.
// completeTask metodunu TodoList içine ekle: indexOfFirst ile bul, copy ile güncelle.

Örnek çözüm

Main.kt
fun main() {
    val list = TodoList()
    list.addTask("Alışveriş")
    list.addTask("Ödev")
    list.completeTask("Ödev")
    list.listTasks()
}

data class Task(val title: String, val done: Boolean = false) {
    fun format() = if (done) "[x] $title" else "[ ] $title"
}

class TodoList {
    val tasks = mutableListOf<Task>()
    fun addTask(title: String) {
        tasks.add(Task(title))
    }
    fun listTasks() {
        tasks.forEach { println(it.format()) }
    }
    fun completeTask(title: String) {
        val i = tasks.indexOfFirst { it.title == title }
        if (i >= 0) {
            tasks[i] = tasks[i].copy(done = true)
        }
    }
}

Beklenen çıktı

[ ] Alışveriş
[x] Ödev

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İfadeyi rolüyle eşleştir

Kavram Anlamı
completeTask(title) Görevi tamamlar
indexOfFirst { } İlk eşleşmenin indeksi
copy(done = true) Yeni kopya, done = true
tasks[i] = ... Listedeki yeri güncellenir

2 completeTask nasıl bir güncelleme yapar?

  • Yeni bir liste yapar
  • copy ile yeni Task yaratıp yerine koyar Doğru cevap
  • Eski Task'ı siler
  • Task'ı null yapar

Açıklama: Task değişmez olduğundan copy ile yeni kopya yapıp yerine koyarız.

3 Boşluğu doldur: copy ile güncelle

Soru
tasks[i] = tasks[i].____(done = true)
Cevap
tasks[i] = tasks[i].copy(done = true)

Açıklama: tasks[i].copy(done = true) yeni kopya yapar.

Başlangıç bölümündeki tüm dersler