ExercĂcio: Contador
Neste exercĂcio, vocĂȘ usarĂĄ uma estrutura de dados muito simples e a tornarĂĄ genĂ©rica. Ela usa um std::collections::HashMap
para acompanhar quais valores foram vistos e quantas vezes cada um apareceu.
A versĂŁo inicial de Counter
Ă© codificada para funcionar apenas para valores u32
. Faça a estrutura e seus métodos genéricos sobre o tipo de valor sendo rastreado, dessa forma Counter
pode rastrear qualquer tipo de valor.
Se vocĂȘ terminar cedo, tente usar o mĂ©todo entry
para reduzir pela metade o nĂșmero de pesquisas de hash necessĂĄrias para implementar o mĂ©todo count
.
use std::collections::HashMap; /// Counter conta o nĂșmero de vezes que cada valor do tipo T foi visto. struct Counter { values: HashMap<u32, u64>, } impl Counter { /// Cria um novo Counter. fn new() -> Self { Counter { values: HashMap::new(), } } /// Conta uma ocorrĂȘncia do valor fornecido. 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); } } /// Retorna o nĂșmero de vezes que o valor fornecido foi visto. 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!("viu {} valores iguais a {}", ctr.times_seen(i), i); } let mut strctr = Counter::new(); strctr.count("apple"); strctr.count("orange"); strctr.count("apple"); println!("obteve {} maçãs", strctr.times_seen("apple")); }