sorting - 用 rust 打印 NBA MVP 名单

标签 sorting rust hashmap

我正在阅读 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);
    }

}

最佳答案

终于找到了更好的。

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);
}

关于sorting - 用 rust 打印 NBA MVP 名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55989927/

相关文章:

rust - 是否可以在rust中写入值大于127的文字字节字符串?

java - HashMap 中的空键和空值

data-structures - 电话簿的数据结构,它可以按姓名搜索号码,也可以按号码搜索姓名

java - 泛型对执行时间的影响

javascript - 在 JavaScript 中按任意列表对对象数组进行排序

java - Java 叠加插入排序

vector - 如何将文件中的数字列表读入 Vec?

arrays - 使用索引数组并行写入数组

algorithm - 插入排序中比较和交换的区别

按顺时针顺序对 3D 点列表进行排序