【问题标题】:How to turn two nested HashMaps in a Vec of tuples without for loops?如何在没有 for 循环的情况下在元组 Vec 中转换两个嵌套的 HashMap?
【发布时间】:2021-04-21 05:46:37
【问题描述】:

取以下数据类型:

let mut items = HashMap::<u64, HashMap<u64, bool>>::new();

我成功地把它变成了这样的元组向量:

let mut vector_of_tuples: Vec<(u64, u64, bool)> = vec![];

for (outer_id, inner_hash_map) in items.iter() {
    for (inner_id, state) in inner_hash_map.iter() {
        vector_of_tuples.push((*outer_id, *inner_id, *state));
    }
}

但我想缩小此代码逻辑,可能借助 Rust 标准库中的 MapZip 函数。

如何在不使用 for 循环的情况下获得相同的结果?

【问题讨论】:

    标签: rust hashmap tuples vec


    【解决方案1】:

    如何在不使用 for 循环的情况下获得相同的结果?

    您可以使用 collect() 从迭代器构建向量,而无需显式循环:

    let vector_of_tuples: Vec<(u64, u64, bool)> = items
        .iter()
        // ...
        .collect();
    

    要将内部哈希映射的内容展开到迭代器中,可以使用flat_map

    let vector_of_tuples: Vec<_> = items
        .iter()
        .flat_map(|(&outer_id, inner_hash_map)| {
            inner_hash_map
                .iter()
                .map(move |(&inner_id, &state)| (outer_id, inner_id, state))
        })
        .collect();
    

    在许多情况下,链式迭代器适配器将产生比等效的for 循环更易于理解的代码,因为迭代器是以声明式的方式编写的,并且往往不需要副作用。但是,在这种特殊情况下,原始的 for 循环实际上可能是更易读的选项。 YMMV,最佳选择有时取决于您和其他项目贡献者的编程背景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 2022-01-23
      相关资源
      最近更新 更多