Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. use std::collections::HashMap;
  2.  
  3. fn main() {
  4. print_all(&vec![7, 3, 2, 4, 4, 5, 5, 6]);
  5. print_all(&vec![7, 3, 2, 4, 5, 4, 5, 5, 6]);
  6. print_all(&vec![]);
  7. }
  8.  
  9. fn print_all(list: &Vec<u32>) {
  10. println!("{:?}", list);
  11.  
  12. println!("Average: {:?}", average(&list));
  13. println!("Media: {:?}", median(&list));
  14. println!("Mode: {:?}", mode(&list));
  15. }
  16.  
  17. fn average(list: &Vec<u32>) -> Option<f64> {
  18. let sum = list.iter().sum::<u32>() as f64;
  19. let average = sum / list.len() as f64;
  20.  
  21. if average.is_nan() {
  22. None
  23. } else {
  24. Some(average)
  25. }
  26. }
  27.  
  28. fn median(list: &Vec<u32>) -> Option<f64> {
  29. let mut list = list.clone();
  30. list.sort_unstable();
  31.  
  32. let start = list.len().checked_sub(1).unwrap_or(0) / 2;
  33. let end = list.len().checked_add(1).unwrap_or(0) / 2;
  34.  
  35. let slice = Vec::from(&list[start..end]);
  36. average(&slice)
  37. }
  38.  
  39. fn mode(list: &Vec<u32>) -> Option<Vec<u32>> {
  40. if list.is_empty() {
  41. return None;
  42. }
  43.  
  44. let mut bins = HashMap::new();
  45.  
  46. let mut largest = 0;
  47. for e in list.iter() {
  48. let count = bins.entry(*e).or_insert(0);
  49. *count += 1;
  50. if *count > largest {
  51. largest = *count;
  52. }
  53. }
  54.  
  55. Some(
  56. bins.iter()
  57. .filter_map(|(k, v)| if v == &largest { Some(k.clone()) } else { None })
  58. .collect(),
  59. )
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement