我想依次遍历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
已经排序,所以我可能应该注意,虽然这是正确的,但实际上并没有{{1 }}后跟HashMap
(当然,只要您对它进行一次排序即可)。以下是随机sort()
地图的一些基准测试结果:
此外,u32->u32
仅允许单个排序顺序。
答案 0 :(得分:5)
HashMap
不保证特定的迭代顺序。实现一致顺序的最简单方法是使用基于BTreeMap
的{{1}},对数据进行排序。
您应该了解,任何实现都将在B-tree
内存中执行此操作,尤其是要存储对所有项目的引用,并至少需要O(n)
时间来整理数据。
如果您了解这样做的成本,可以使用O(n * log(n))
板条箱中的IterTools::sorted
。
itertools