CodeBlanks Logo Icon CodeBlanks

scan

scan ile ara sonuçları öğrenirsin.

scan ile çalışan accumulate

scan, fold'a benzer ama her ara sonucu bir listede biriktirir. Bu, ara durumları görmek için kullanışlıdır.

Örnek: listOf(1, 2, 3).scan(0) { acc, n -> acc + n } ifadesi [0, 1, 3, 6] döndürür. İlk değer listede yer alır; her öğe için ara toplam eklenir. fold yalnızca sonucu verirken, scan tüm geçişi gösterir. Bu kalıp, çalışan toplam ve kümülatif hesaplar için idealdir.

scan ve fold farkı

fold yalnızca son değeri döndürür. scan ise başlangıç değeri dahil tüm ara değerleri liste olarak döndürür. Bu yüzden scan çıktısı her zaman giriş boyutundan bir fazladır.

Örnek: listOf(1, 2, 3).fold(0) { acc, n -> acc + n } sonucu 6. Aynı işlemi scan ile yaparsan [0, 1, 3, 6] alırsın. scan, ilerlemeyi izlemek istediğinde tercih edilir.

Uygulama Çalışan toplam hesapla

main içinde listOf(1, 2, 3, 4).scan(0) { acc, n -> acc + n } sonucunu bir değişkene ata ve println ile yazdır.

Başlangıç kodu

Main.kt
// main'de 1..4 listesinin çalışan toplamını scan ile hesapla
// sonucu println ile yazdır

Örnek çözüm

Main.kt
fun main() {
    val running = listOf(1, 2, 3, 4).scan(0) { acc, n ->
        acc + n
    }
    println(running)
}

Beklenen çıktı

[0, 1, 3, 6, 10]

Soru ve cevaplar

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

1 listOf(1, 2, 3).scan(0) { acc, n -> acc + n } çağrısı ne döndürür?

  • [0, 1, 3, 6] Doğru cevap
  • [1, 3, 6]
  • [0, 1, 2, 3]
  • [6]

Açıklama: scan başlangıç değeri dahil tüm ara toplamları verir.

2 scan parçalarını eşle

Kavram Anlamı
scan(0) Başlangıç değeri
{ acc, n -> } Lambda
[0, 1, 3, 6] Ara sonuçlar
fold(0) Yalnızca son değer

3 scan çağrısını tamamla

Soru
val running = listOf(1, 2, 3).____(0) { acc, n -> acc + n }
Cevap
val running = listOf(1, 2, 3).scan(0) { acc, n -> acc + n }

Açıklama: scan başlangıç değeriyle ara sonuçları listeler.

İleri seviye bölümündeki tüm dersler