Alıştırma: Sayıcı

Bu alıştırmada çok basit bir veri yapısı alıp onu genelleştirilmiş (generic) hale getireceksiniz. Hangi değerlerin görüldüğünü ve her birinin kaç kez göründüğünü takip etmek için bir std::collections::HashMap kullanır.

Counter’ın ilk sürümü sadece u32 değerleri için çalışacak şekilde sabit kodlanmıştır. Yapıyı ve metotlarını, izlenen değerin türü üzerinde genelleştirme (generic) yapın, bu şekilde Counter her tür değeri izleyebilir.

Eğer erken bitirirseniz, count metodunu gerçekleştirmek (implement) için gereken özet (hash) arama sayısını yarıya indirmek için entry metodunu kullanmayı deneyin.

use std::collections::HashMap;

/// Counter, T türündeki her bir değerin kaç kez görüldüğünü sayar.
struct Counter {
    values: HashMap<u32, u64>,
}

impl Counter {
    /// Yeni bir Counter oluştur.
    fn new() -> Self {
        Counter {
            values: HashMap::new(),
        }
    }

    /// Verilen değerin bir tekrarını say.
    fn count(&mut self, value: u32) {
        if self.values.contains_key(&value) {
            *self.values.get_mut(&value).unwrap() += 1;
        } else {
            self.values.insert(value, 1);
        }
    }

    /// Verilen değerin kaç kez görüldüğünü geri döndür.
    fn times_seen(&self, value: u32) -> u64 {
        self.values.get(&value).copied().unwrap_or_default()
    }
}

fn main() {
    let mut ctr = Counter::new();
    ctr.count(13);
    ctr.count(14);
    ctr.count(16);
    ctr.count(14);
    ctr.count(14);
    ctr.count(11);

    for i in 10..20 {
        println!("{} değer {}`e eşit görüldü", ctr.times_seen(i), i);
    }

    let mut strctr = Counter::new();
    strctr.count("elma");
    strctr.count("portakal");
    strctr.count("elma");
    println!("{} elma alındı", strctr.times_seen("elma"));
}