rust 如何从给定的键开始遍历HashMap?

sxissh06  于 2023-01-26  发布在  其他
关注(0)|答案(2)|浏览(199)

给定n元素的HashMap,如何从n-x元素开始迭代?
元素的顺序并不重要,我需要解决的唯一问题是从给定的键开始迭代。
示例:

let mut map: HashMap<&str, i32> = HashMap::new();
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
map.insert("four", 4);
[...]

for (k, v) in map {
    //how to start iteration from third item and not the first one
}

试着谷歌一下,但到目前为止还没有找到例子。

lvjbypge

lvjbypge1#

试着谷歌一下,但到目前为止还没有找到例子。
这是因为正如Chayim Friedman指出的那样,散列表的内部顺序基本上是随机的,这意味着它的迭代顺序是任意的,因此从键(/条目)开始迭代或在键(/条目)之间迭代没有多大意义。
这听起来很像XY问题,你为什么要“从给定的键开始”迭代呢?
不过如果你真的想这样做,你可以只使用skip_while适配器,并跳过,而你还没有找到你正在寻找的关键。
或者,由于您的帖子不明确(您同时讨论了键和位置),您可以使用skip适配器跳过固定数量的项目。
从技术上讲,它们都不会从那个条目开始迭代,它们都从0开始迭代,但只会产生指定断点之后的项。标准库的散列表不支持范围迭代(因为这在散列表上没有任何意义),它的迭代器也不是随机访问的(出于类似的原因)。

dced5bon

dced5bon2#

您可能希望使用BTreeMap,它具有排序键和一个range函数,该函数迭代一系列键。

use std::collections::BTreeMap;

fn main() {
    let mut map = BTreeMap::new();
    map.insert(1, "one");
    map.insert(2, "two");
    map.insert(3, "three");
    for (&key, &value) in map.range(2..) {
        println!("{key}: {value}");
    }
}

// 2: two
// 3: three

相关问题