From f14854a69900f34b8d67a08abc2c7ea20f2109cd Mon Sep 17 00:00:00 2001 From: Daniel Tomlinson Date: Tue, 24 Nov 2020 11:26:26 +0000 Subject: [PATCH] Adding latest stats --- src/stats.rs | 74 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/src/stats.rs b/src/stats.rs index e92d21a..cda1df3 100644 --- a/src/stats.rs +++ b/src/stats.rs @@ -1,16 +1,16 @@ -use std::convert::TryFrom; use ::std::collections::HashMap; - +use std::convert::TryFrom; #[derive(Debug)] -pub struct NewStatsCalculator<'a> { - data: &'a mut Vec, +pub struct NewStatsCalculator { + data: Vec, length: u32, total: i32, } -impl<'a> NewStatsCalculator<'a> { - pub fn from_vec(initial_data: &'a mut Vec) -> Self { +impl NewStatsCalculator { + pub fn from_vec(initial_data: &[i32]) -> Self { + let initial_data = initial_data.to_vec(); let mut instance = NewStatsCalculator { data: initial_data, length: 0, @@ -65,14 +65,26 @@ impl<'a> NewStatsCalculator<'a> { } } - // pub fn get_mode(&self) -> HashMap<&mut i32, i32> { - // let mut mode = HashMap::new(); - // for ref i in self.data { - // let count = mode.entry(i).or_insert(0); - // *count += 1; - // } - // mode - // } + pub fn get_mode(&self) -> Option<(i32, i32)> { + let mut mode: HashMap = HashMap::new(); + for i in &self.data { + let count = mode.entry(*i).or_insert(0); + *count += 1; + } + let mut mode_value: Option<(i32, i32)> = mode + .iter() + .max_by(|a, b| a.1.cmp(b.1)) + .map(|(k, v)| (*k, *v)); + + if let Some((_, v)) = mode_value { + if v == 1 { + mode_value = None + } + } + + // println!("{:?}", mode_value); + mode_value + } } #[cfg(test)] @@ -81,38 +93,52 @@ mod test { #[test] fn test_get_length() { - let mut data = vec![1, 2, 3, 4, 5, 6]; - let mut test = NewStatsCalculator::from_vec(&mut data); + let data = vec![1, 2, 3, 4, 5, 6]; + let mut test = NewStatsCalculator::from_vec(&data); test.get_length(); assert_eq!(test.length, 6); } #[test] fn test_get_total() { - let mut data = vec![1, 2, 3, 4, 5, 6]; - let mut test = NewStatsCalculator::from_vec(&mut data); + let data = vec![1, 2, 3, 4, 5, 6]; + let mut test = NewStatsCalculator::from_vec(&data); test.get_length(); assert_eq!(test.total, 21); } #[test] fn test_get_mean() { - let mut data = vec![1, 2, 3, 4, 5, 6]; - let test = NewStatsCalculator::from_vec(&mut data); + let data = vec![1, 2, 3, 4, 5, 6]; + let test = NewStatsCalculator::from_vec(&data); assert_eq!(test.get_mean(), 3.5); } #[test] fn test_get_median_even() { - let mut data = vec![1, 2, 3, 4, 5, 6]; - let mut test = NewStatsCalculator::from_vec(&mut data); + let data = vec![1, 2, 3, 4, 5, 6]; + let mut test = NewStatsCalculator::from_vec(&data); assert_eq!(test.get_median(), 3.5); } #[test] fn test_get_median_odd() { - let mut data = vec![1, 2, 3, 4, 5, 6, 7]; - let mut test = NewStatsCalculator::from_vec(&mut data); + let data = vec![1, 2, 3, 4, 5, 6, 7]; + let mut test = NewStatsCalculator::from_vec(&data); assert_eq!(test.get_median(), 4.0); } + + #[test] + fn test_get_mode_with_mode() { + let data = vec![1, 2, 3, 4, 5, 6, 6]; + let test = NewStatsCalculator::from_vec(&data); + assert_eq!(test.get_mode(), Some((6, 2))) + } + + #[test] + fn test_get_mode_without_mode() { + let data = vec![1, 2, 3, 4, 5, 6]; + let test = NewStatsCalculator::from_vec(&data); + assert_eq!(test.get_mode(), None) + } }