gpt4 book ai didi

rust - 如何按顺序遍历 HashMap 的键

转载 作者:行者123 更新时间:2023-12-03 11:32:11 26 4
gpt4 key购买 nike

我想遍历 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 的一些基准测试结果 map :

hashmap vs btreemap

此外,还有一个 BTreeMap只允许一个排序顺序。

最佳答案

HashMap不保证特定的迭代顺序。实现一致顺序的最简单方法是使用 BTreeMap这是基于 B-tree , 数据被排序的地方。

你应该明白,任何实现都会在 O(n) 中做到这一点。内存,特别是存储对所有项目的引用,至少是 O(n * log(n))是时候整理数据了。

如果您了解这样做的成本,您可以使用 IterTools::sorted来自 itertools箱。

use itertools::Itertools; // 0.8.2
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());

println!("{:#?}", m.iter().sorted())
}

Playground link

关于rust - 如何按顺序遍历 HashMap 的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59051781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com