我正在阅读 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/