Created
April 27, 2020 13:42
-
-
Save cimourdain/dac66ff45e9eb72c4127c8e41aaa8e54 to your computer and use it in GitHub Desktop.
Rust Book - Section 8 Mean Median Mode
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::collections::HashMap; | |
use std::cmp::Ordering; | |
fn main() { | |
// mean | |
let v = vec![1.0, 2.0, 3.0, 4.0, 5.0]; | |
let empty_vector: Vec<f32> = Vec::new(); | |
let negative_vector = vec![-1.0, -15.0, -30.0, -55.0]; | |
let decimal_vector = vec![1.0, 2.0]; | |
println!("Mean is {}", mean(&v)); | |
println!("Mean of empty vector is {}", mean(&empty_vector)); | |
println!("Mean of negative vector is {}", mean(&negative_vector)); | |
println!("Mean of decimal vector is {}", mean(&decimal_vector)); | |
// can still use vector | |
println!("first value of vector is : {}", v[0]); | |
let v_odd = vec![5.0, 1.0, 2.0, 3.0, 4.0]; | |
let v_even = vec![6.0, 1.0, 2.0, 3.0, 4.0, 5.0]; | |
println!("Median of odd = {} (expected 3)", median(&v_odd)); | |
println!("Median of even = {} (expected 3.5)", median(&v_even)); | |
// can still use vector | |
// original vector not sorted | |
println!("first value of (now sorted) vector is : {}", v_odd[0]); | |
let v = vec![1, 2, 2, 4, 4, 4, 4, 5]; | |
println!("Mode of {} (expected 4)", mode(&v)); | |
} | |
fn mean(v: &Vec<f32>) -> f32 { | |
let sum: f32 = v.iter().sum(); | |
let vector_length = v.len(); | |
match vector_length { | |
0 => 0f32, | |
_ => sum / vector_length as f32, | |
} | |
} | |
fn median(v1: &Vec<f32>) -> f32 { | |
// create a clone vector to not alter original vector | |
let mut v = v1.clone(); | |
// https://doc.rust-lang.org/std/vec/struct.Vec.html#method.sort_by | |
v.sort_by(|a, b| a.partial_cmp(b).unwrap()); | |
// select median | |
let remain = v.len() % 2; | |
let middle = v.len() / 2; | |
match remain { | |
0 => mean(&vec![v[middle-1], v[middle]]), | |
_ => v[middle], | |
} | |
} | |
fn mode(v: &Vec<i32>) -> i32 { | |
let mut max = 0; | |
let mut mode = 0; | |
let mut counter_map: HashMap<i32, i32> = HashMap::new(); | |
for &i in v { | |
let count = counter_map.entry(i).or_insert(0); | |
*count += 1; | |
match max.cmp(&count) { | |
Ordering::Less => { | |
max = *count; | |
mode = i; | |
}, | |
_ => (), | |
} | |
} | |
mode | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment