我希望能按顺序迭代一个 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
,那么迭代将自动按顺序进行。 - Sven MarnachBTreeMap
,也知道它在算法上是最优的。我只是想问一下编码人性化方面是否有更短、更优雅的写法。 - Timmmm