Вправа: Лічильник
У цій вправі ви візьмете дуже просту структуру даних і зробите її узагальненою. Вона використовує std::collections::HashMap
для відстеження того, які значення було переглянуто і скільки разів кожне з них з'являлося.
Початкова версія Counter
жорстко налаштована на роботу лише зі значеннями u32
. Зробіть структуру та її методи узагальненими щодо типу значення, яке відстежується, таким чином Counter
зможе відстежувати будь-який тип значення.
Якщо ви закінчите раніше, спробуйте використати метод entry
, щоб вдвічі зменшити кількість переглядів хешу, необхідних для реалізації методу count
.
use std::collections::HashMap; /// Counter підраховує кількість разів, коли кожне значення типу T було переглянуто. struct Counter { values: HashMap<u32, u64>, } impl Counter { /// Створює новий Counter. fn new() -> Self { Counter { values: HashMap::new(), } } /// Підраховує входження заданого значення. 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); } } /// Повертає кількість разів, коли було побачено задане значення. 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!("побачив {} значень рівних {}", ctr.times_seen(i), i); } let mut strctr = Counter::new(); strctr.count("яблуко"); strctr.count("апельсин"); strctr.count("яблуко"); println!("отримав {} яблук", strctr.times_seen("яблуко")); }