use std::collections::HashMap;
use std::io;
use rand::Rng;
fn get_number_input(field_name: &String) -> usize {
loop {
let mut number_input_str = String::new();
println!("Enter {}:", field_name);
io::stdin()
.read_line(&mut number_input_str)
.expect("Failed to read line");
match number_input_str.trim().parse() {
Ok(input_result) => {
if input_result < 1 {
println!("{} must be greater than 0", field_name);
} else {
break input_result;
}
},
Err(_) => {
println!("Invalid {}: {}", field_name, number_input_str)
}
}
}
}
fn main() {
let list_size = get_number_input(&"list_size".to_string());
println!("list_size: {}", list_size);
let mut num_occurs = HashMap::new();
let mut num_list = Vec::new();
for _ in 0..list_size {
let random_number = rand::thread_rng().gen_range(1..=100);
let count = num_occurs.entry(random_number).or_insert(0);
*count += 1;
num_list.push(random_number);
}
num_list.sort();
println!("List of integers {:?}", num_list);
let middle_position = num_list.len() / 2;
let medians = &num_list[middle_position - (num_list.len() % 2 ^ 1)..middle_position + 1];
let median_sum: i32 = medians.iter().sum();
let median = median_sum as f32 / medians.len() as f32;
println!("median: {}", median);
let mut mode_entry = (0, 0);
let mut mapped_by_count = HashMap::new();
for entry in num_occurs {
if entry.1 > mode_entry.1 {
mode_entry = entry;
}
let numbers_mapped_by_count = mapped_by_count.entry(entry.1).or_insert(vec![]);
numbers_mapped_by_count.push(entry.0);
}
if mode_entry.1 > 1 {
let modes = mapped_by_count.get_mut(&mode_entry.1).unwrap();
modes.sort();
println!("Mode(s): {:?}", modes);
} else {
println!("Mode does not exist!");
}
}