【发布时间】:2020-03-21 22:08:11
【问题描述】:
我想按顺序遍历 HashMap 的键。有没有一种优雅的方式来做到这一点?我能想到的最好的是:
use std::collections::HashMap;
fn main() {
let mut m = HashMap::<String, String>::new();
m.insert("a".to_string(), "1".to_string());
m.insert("b".to_string(), "2".to_string());
m.insert("c".to_string(), "3".to_string());
m.insert("d".to_string(), "4".to_string());
let mut its = m.iter().collect::<Vec<_>>();
its.sort();
for (k, v) in &its {
println!("{}: {}", k, v);
}
}
我希望能够做这样的事情:
for (k, v) in m.iter_sorted() {
}
for (k, v) in m.iter_sorted_by(...) {
}
显然我可以写一个特征来做到这一点,但我的问题是这样的东西已经存在了吗?
编辑:另外,由于人们指出BTreeMap 已经排序,我可能应该注意到虽然这是真的,但它实际上不如HashMap 快sort()(当然只要你只排序一次)。以下是随机u32->u32 地图的一些基准测试结果:
另外,BTreeMap 只允许一个排序顺序。
【问题讨论】:
-
如果你真的想要
HashMap,这在概念上是你能做的最好的。如果您可以使用BTreeMap,迭代将自动按顺序进行。 -
是的,我知道
BTreeMap,我知道这是算法最优的。我只是在询问有关编码人体工程学的问题-基本上是否有一种更短更优雅的方式来编写它。