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")); }