如何按插入顺序对地图进行排序?

Fla*_*tis 7 rust

我已经尝试过使用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,但迭代和删除速度非常


Mat*_* M. 7

关联容器(将键映射到值的容器)通常使用两种策略之一来有效地查找键:

  • 他们要么根据某种比较操作对键进行排序
  • 或者他们根据某种哈希运算对密钥进行哈希处理

在这里,您有两个原型:BTree对键进行排序并对HashMap它们进行散列。


如果您只想跟踪插入的顺序,那么关联容器是错误的容器选择,您想要的是序列容器,例如std::vec::Vec:始终将项目推到末尾,并且您可以按顺序迭代它们他们被插入了。

注意:我建议编写一个包装器以防止在其他地方进行不需要的插入。


另一方面,如果您想要一个跟踪插入顺序的关联容器,那么据我所知,Rust 中尚不存在您所要求的内容。

在 C++ 中,首选解决方案称为 Boost.MultiIndex,它允许您创建一个可以通过多种不同方式查询的容器;这是一个相当复杂的软件,如果您浏览它的源代码,您就可以看到这一点。它可能会及时出现在 Rust 中,但如果你现在需要一些东西,我担心你将不得不手动推出你自己的解决方案;您可以使用 Boost 代码作为参考,尽管根据经验,它可能很难阅读/理解。


She*_*ter 6

默认集合不跟踪插入顺序。如果您想以此排序,您需要找到一个可以跟踪它的不同集合,或者自己跟踪它。

  • 如果允许外部 crate,则 [linked-hash-map](https://crates.io/crates/linked-hash-map) crate 就是这样一个集合跟踪插入顺序。 (6认同)