Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::collections::HashMap;
- fn main() {
- print_all(&vec![7, 3, 2, 4, 4, 5, 5, 6]);
- print_all(&vec![7, 3, 2, 4, 5, 4, 5, 5, 6]);
- print_all(&vec![]);
- }
- fn print_all(list: &Vec<u32>) {
- println!("{:?}", list);
- println!("Average: {:?}", average(&list));
- println!("Media: {:?}", median(&list));
- println!("Mode: {:?}", mode(&list));
- }
- fn average(list: &Vec<u32>) -> Option<f64> {
- let sum = list.iter().sum::<u32>() as f64;
- let average = sum / list.len() as f64;
- if average.is_nan() {
- None
- } else {
- Some(average)
- }
- }
- fn median(list: &Vec<u32>) -> Option<f64> {
- let mut list = list.clone();
- list.sort_unstable();
- let start = list.len().checked_sub(1).unwrap_or(0) / 2;
- let end = list.len().checked_add(1).unwrap_or(0) / 2;
- let slice = Vec::from(&list[start..end]);
- average(&slice)
- }
- fn mode(list: &Vec<u32>) -> Option<Vec<u32>> {
- if list.is_empty() {
- return None;
- }
- let mut bins = HashMap::new();
- let mut largest = 0;
- for e in list.iter() {
- let count = bins.entry(*e).or_insert(0);
- *count += 1;
- if *count > largest {
- largest = *count;
- }
- }
- Some(
- bins.iter()
- .filter_map(|(k, v)| if v == &largest { Some(k.clone()) } else { None })
- .collect(),
- )
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement