// hashmaps3.rs // A list of scores (one per line) of a soccer match is given. Each line // is of the form : // ,,, // Example: England,France,4,2 (England scored 4 goals, France 2). // You have to build a scores table containing the name of the team, goals // the team scored, and goals the team conceded. One approach to build // the scores table is to use a Hashmap. The solution is partially // written to use a Hashmap, complete it to pass the test. // Make me pass the tests! // Execute `rustlings hint hashmaps3` or use the `hint` watch subcommand for a hint. use std::collections::HashMap; // A structure to store team name and its goal details. struct Team { name: String, goals_scored: u8, goals_conceded: u8, } // Add or update an entry in the scores table fn update_hash(scores: &mut HashMap, name: &str, score: u8, scored_upon: u8) { scores .entry(name.to_string()) .and_modify(|team| { team.goals_scored += score; team.goals_conceded += scored_upon; }) .or_insert(Team { name: name.to_string(), goals_scored: score, goals_conceded: scored_upon, }); } fn build_scores_table(results: String) -> HashMap { // The name of the team is the key and its associated struct is the value. let mut scores: HashMap = HashMap::new(); for r in results.lines() { let v: Vec<&str> = r.split(',').collect(); let (team_1_name, team_1_score): (&str, u8) = (v[0], v[2].parse().unwrap()); let (team_2_name, team_2_score): (&str, u8) = (v[1], v[3].parse().unwrap()); // TODO: Populate the scores table with details extracted from the // current line. Keep in mind that goals scored by team_1 // will be the number of goals conceded from team_2, and similarly // goals scored by team_2 will be the number of goals conceded by // team_1 update_hash(&mut scores, team_1_name, team_1_score, team_2_score); update_hash(&mut scores, team_2_name, team_2_score, team_1_score); } scores } #[cfg(test)] mod tests { use super::*; fn get_results() -> String { let results = "".to_string() + "England,France,4,2\n" + "France,Italy,3,1\n" + "Poland,Spain,2,0\n" + "Germany,England,2,1\n"; results } #[test] fn build_scores() { let scores = build_scores_table(get_results()); let mut keys: Vec<&String> = scores.keys().collect(); keys.sort(); assert_eq!( keys, vec!["England", "France", "Germany", "Italy", "Poland", "Spain"] ); } #[test] fn validate_team_score_1() { let scores = build_scores_table(get_results()); let team = scores.get("England").unwrap(); assert_eq!(team.goals_scored, 5); assert_eq!(team.goals_conceded, 4); } #[test] fn validate_team_score_2() { let scores = build_scores_table(get_results()); let team = scores.get("Spain").unwrap(); assert_eq!(team.goals_scored, 0); assert_eq!(team.goals_conceded, 2); } }