Распечатать список НБА MVP в ржавчине - PullRequest
0 голосов
/ 05 мая 2019

Я читал https://www.nba.com/history/awards/mvp. И я попытался распечатать имя и считать в порядке убывания.

Kareem Abdul-Jabbar: 6
Bill Russell: 5
Michael Jordan: 5
LeBron James: 4
Wilt Chamberlain: 4
Magic Johnson: 3
...

Как новичок, мне удалось сделать это, как показано ниже.
Я использовал HashMap для подсчета по имени и Vec для сортировки по значению.
Но я думаю, что может быть лучшее решение.
Буду признателен за любые советы по улучшению этого.

use std::collections::HashMap;

const MVPS: &str = concat!(
        "2017-18     James Harden, Houston Rockets (Voting)\n",
        "2016-17     Russell Westbrook, Oklahoma City Thunder (Voting)\n",
        ... omitted for brevity
);

fn main() {

    let lines: Vec<&str> = MVPS.split('\n')
        .map(|line| &line[12..line.find(',').unwrap_or(line.len())])
        .collect();

    let mut mvp_map = HashMap::new();
    for name in &lines {
        mvp_map.insert(name, mvp_map.get(name).unwrap_or(&0) + 1);
    }

    let mut mvp_entry_list = Vec::new();
    for entry in &mvp_map {
        mvp_entry_list.push(entry);
    }
    mvp_entry_list.sort_by(|a, b| (b.1).cmp(a.1));

    for e in &mvp_entry_list {
        println!("{}: {}", e.0, e.1);
    }

}

1 Ответ

0 голосов
/ 06 мая 2019

Наконец-то я поправился.

use itertools::Itertools;

const MVPS: &str = concat!(
        "2017-18     James Harden, Houston Rockets (Voting)\n",
        "2016-17     Russell Westbrook, Oklahoma City Thunder (Voting)\n",
        ... omitted for brevity
);

fn main() {

    let mvps_count = MVPS.lines()
        .map(|line| &line[12..line.find(',').unwrap_or(line.len())])
        .into_iter()
        .sorted()
        .group_by(|name| *name)
        .into_iter()
        .map(|(key, group)| (key, group.count()))
        .sorted_by(|a, b| (b.1).cmp(&a.1))
        .inspect(|(key, count)| println!("{}: {}", key, count))
        .map(|(_key, count)| count)
        .fold(0 as usize, |a, b| a + b);

    println!("{}", MVPS.lines().count() == mvps_count);
}

...