如何依次遍历HashMap的键

时间:2019-11-26 13:13:23

标签: rust hashmap

我想依次遍历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()地图的一些基准测试结果:

hashmap vs btreemap

此外,u32->u32仅允许单个排序顺序。

1 个答案:

答案 0 :(得分:5)

HashMap不保证特定的迭代顺序。实现一致顺序的最简单方法是使用基于BTreeMap的{​​{1}},对数据进行排序。

您应该了解,任何实现都将在B-tree内存中执行此操作,尤其是要存储对所有项目的引用,并至少需要O(n)时间来整理数据。

如果您了解这样做的成本,可以使用O(n * log(n))板条箱中的IterTools::sorted

itertools

Playground link