From e029856b4b9be91bfa31c1a59176526e8bd823c8 Mon Sep 17 00:00:00 2001 From: Daniel Tomlinson Date: Sun, 15 Nov 2020 16:45:33 +0000 Subject: [PATCH 1/4] Adding latest --- src/stats.rs | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/stats.rs b/src/stats.rs index edb474e..d4b3fa2 100644 --- a/src/stats.rs +++ b/src/stats.rs @@ -2,16 +2,22 @@ use std::convert::TryFrom; #[derive(Debug)] pub struct StatsCalculator { - data: Vec, + data: &Vec, + length: i32, + total: i32, } -impl StatsCalculator { +impl StatsCalculator{ pub fn default_data() -> Self { - Self::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) + Self::from_vec(&vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) } - pub fn from_vec(initial_data: Vec) -> Self { - return StatsCalculator { data: initial_data }; + pub fn from_vec(&initial_data: &Vec) -> Self { + return StatsCalculator { + data: &initial_data, + length: Self::get_length(&initial_data), + total: Self::get_total(&initial_data), + }; } // pub fn initialise(&mut self) -> () { @@ -28,8 +34,8 @@ impl StatsCalculator { // } // } - fn get_length(&self) -> i32 { - let length = i32::try_from(self.data.len()); + fn get_length(&initial_data: &Vec) -> i32 { + let length = i32::try_from(initial_data.len()); if let Ok(i) = length { return i; @@ -38,23 +44,20 @@ impl StatsCalculator { } } - fn get_total(&self) -> i32 { - return self.data.iter().sum(); + fn get_total(&initial_data: &Vec) -> i32 { + return initial_data.iter().sum(); } pub fn get_mean(&self) -> f32 { - let total = self.get_total(); - let length = self.get_length(); - return total as f32 / length as f32; + return self.total as f32 / self.length as f32; } pub fn get_median(&mut self) -> f32 { - let length = self.get_length(); - let mid = length as usize / 2; + let mid = self.length as usize / 2; self.data.sort(); - if length % 2 != 0 { + if self.length % 2 != 0 { return self.data[mid] as f32; } else { return (self.data[mid - 1] as f32 + self.data[mid] as f32) / 2.0; From fc088c691e9528f4e9152dc27acf0be5c256a66b Mon Sep 17 00:00:00 2001 From: Daniel Tomlinson Date: Tue, 17 Nov 2020 22:03:26 +0000 Subject: [PATCH 2/4] Adding Clippy annotations --- src/main.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 84a9584..cb6825c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,12 @@ +#![warn(clippy::all, clippy::pedantic)] +#![allow(clippy::clippy::cast_precision_loss)] + mod stats; fn main() { // Stats - let mut numbers = stats::StatsCalculator::default_data(); + let mut data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + let mut numbers = stats::NewStatsCalculator::from_vec(&mut data); println!("Data: {:?}", numbers); println!("Mean: {:?}", numbers.get_mean()); println!("Median: {:?}", numbers.get_median()); From f836f6d8d07d95e66407a3f1c883c24a2205da39 Mon Sep 17 00:00:00 2001 From: Daniel Tomlinson Date: Tue, 17 Nov 2020 22:04:00 +0000 Subject: [PATCH 3/4] Adding latest --- src/stats.rs | 60 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/stats.rs b/src/stats.rs index d4b3fa2..422706c 100644 --- a/src/stats.rs +++ b/src/stats.rs @@ -1,23 +1,24 @@ use std::convert::TryFrom; +use ::std::collections::HashMap; + #[derive(Debug)] -pub struct StatsCalculator { - data: &Vec, - length: i32, +pub struct NewStatsCalculator<'a> { + data: &'a mut Vec, + length: u32, total: i32, } -impl StatsCalculator{ - pub fn default_data() -> Self { - Self::from_vec(&vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) - } - - pub fn from_vec(&initial_data: &Vec) -> Self { - return StatsCalculator { - data: &initial_data, - length: Self::get_length(&initial_data), - total: Self::get_total(&initial_data), +impl<'a> NewStatsCalculator<'a> { + pub fn from_vec(initial_data: &'a mut Vec) -> Self { + let mut instance = NewStatsCalculator { + data: initial_data, + length: 0, + total: 0, }; + instance.get_length(); + instance.get_total(); + instance } // pub fn initialise(&mut self) -> () { @@ -34,33 +35,44 @@ impl StatsCalculator{ // } // } - fn get_length(&initial_data: &Vec) -> i32 { - let length = i32::try_from(initial_data.len()); + fn get_length(&mut self) { + let length = u32::try_from(self.data.len()); if let Ok(i) = length { - return i; + self.length = i; } else { - return 0; + self.length = 0; } } - fn get_total(&initial_data: &Vec) -> i32 { - return initial_data.iter().sum(); + fn get_total(&mut self) { + self.total = self.data.iter().sum(); } pub fn get_mean(&self) -> f32 { - return self.total as f32 / self.length as f32; + self.total as f32 / self.length as f32 } pub fn get_median(&mut self) -> f32 { let mid = self.length as usize / 2; - self.data.sort(); + self.data.sort_unstable(); - if self.length % 2 != 0 { - return self.data[mid] as f32; + if self.length % 2 == 0 { + (self.data[mid - 1] as f32 + self.data[mid] as f32) / 2.0 } else { - return (self.data[mid - 1] as f32 + self.data[mid] as f32) / 2.0; + self.data[mid] as f32 } } + + // 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 + // } +} + } } From 648c23d2aa6291f329e286a3fc57e9fcfe9dec36 Mon Sep 17 00:00:00 2001 From: Daniel Tomlinson Date: Tue, 17 Nov 2020 22:04:09 +0000 Subject: [PATCH 4/4] Adding unit tests --- src/stats.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/stats.rs b/src/stats.rs index 422706c..e92d21a 100644 --- a/src/stats.rs +++ b/src/stats.rs @@ -74,5 +74,45 @@ impl<'a> NewStatsCalculator<'a> { // mode // } } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_get_length() { + let mut data = vec![1, 2, 3, 4, 5, 6]; + let mut test = NewStatsCalculator::from_vec(&mut 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); + 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); + 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); + 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); + assert_eq!(test.get_median(), 4.0); } }