我已经尝试过使用HashMap并且BTreeMap为此而且没有工作:
use std::collections::{BTreeMap, HashMap};
fn main() {
let mut btreemap = BTreeMap::new();
println!("BTreeMap");
btreemap.insert("Z", "1");
btreemap.insert("T", "2");
btreemap.insert("R", "3");
btreemap.insert("P", "4");
btreemap.insert("K", "5");
btreemap.insert("W", "6");
btreemap.insert("G", "7");
btreemap.insert("C", "8");
btreemap.insert("A", "9");
btreemap.insert("D", "0");
for (key, value) in btreemap {
println!("{} {}", key, value);
}
println!("Hash Map");
let mut hashmap = HashMap::new();
hashmap.insert("Z", "1");
hashmap.insert("T", "2");
hashmap.insert("R", "3");
hashmap.insert("P", "4");
hashmap.insert("K", "5");
hashmap.insert("W", "6");
hashmap.insert("G", "7");
hashmap.insert("C", "8");
hashmap.insert("A", "9");
hashmap.insert("D", "0");
for (key, value) in hashmap {
println!("{} {}", key, value);
}
}
Run Code Online (Sandbox Code Playgroud)
当我通过Rust游乐场运行时,我得到的结果没有按插入顺序排序; BTreeMap似乎按字母顺序排列(打印A C D G K P R T W Z,连同数字),HashMap似乎是随机排序(打印Z A C D R P T G WK).
我查看了Rust标准库文档,但没有看到任何其他地图.
Ibr*_*med 15
标准库集合都不维护插入顺序。您可以改为使用IndexMap板条箱indexmap,只要您不调用 ,它就会保留插入顺序remove。
use indexmap::indexmap;
let map = indexmap! {
"Z" => 1,
"T" => 2,
"R" => 3,
"P" => 4,
"K" => 5,
"W" => 6,
};
for (k, v) in map {
println!("{}: {}", k, v);
}
// Z: 1
// T: 2
// R: 3
// P: 4
// K: 5
// W: 6
Run Code Online (Sandbox Code Playgroud)
它通过存储哈希表来实现此目的,其中键值对的迭代顺序独立于键的哈希值。这意味着查找可能比标准慢HashMap,但迭代和删除速度非常快。
关联容器(将键映射到值的容器)通常使用两种策略之一来有效地查找键:
在这里,您有两个原型:BTree对键进行排序并对HashMap它们进行散列。
如果您只想跟踪插入的顺序,那么关联容器是错误的容器选择,您想要的是序列容器,例如std::vec::Vec:始终将项目推到末尾,并且您可以按顺序迭代它们他们被插入了。
注意:我建议编写一个包装器以防止在其他地方进行不需要的插入。
另一方面,如果您想要一个也跟踪插入顺序的关联容器,那么据我所知,Rust 中尚不存在您所要求的内容。
在 C++ 中,首选解决方案称为 Boost.MultiIndex,它允许您创建一个可以通过多种不同方式查询的容器;这是一个相当复杂的软件,如果您浏览它的源代码,您就可以看到这一点。它可能会及时出现在 Rust 中,但如果你现在需要一些东西,我担心你将不得不手动推出你自己的解决方案;您可以使用 Boost 代码作为参考,尽管根据经验,它可能很难阅读/理解。
默认集合不跟踪插入顺序。如果您想以此排序,您需要找到一个可以跟踪它的不同集合,或者自己跟踪它。