Skip to content

Instantly share code, notes, and snippets.

@cimourdain
Created April 27, 2020 13:42
Show Gist options
  • Save cimourdain/dac66ff45e9eb72c4127c8e41aaa8e54 to your computer and use it in GitHub Desktop.
Save cimourdain/dac66ff45e9eb72c4127c8e41aaa8e54 to your computer and use it in GitHub Desktop.
Rust Book - Section 8 Mean Median Mode
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