如何同时遍历Vec与BTreeMap?解决嵌套循环重复输出问题
解决BTreeMap与Vec元素一一对应遍历的问题
你当前的嵌套循环逻辑是让BTreeMap中的每个键值对,都完整遍历一遍Vec的所有元素,所以会产生重复的组合输出。要实现一一对应的遍历(即第1个map元素搭配第1个vec元素,第2个map元素搭配第2个vec元素),可以用Rust迭代器的zip方法来配对两个迭代器。
修正后的代码
fn main() { let mut a = std::collections::BTreeMap::new(); a.insert("a", "b"); a.insert("b", "c"); let b = vec!["hi", "Hello"]; // 将BTreeMap的键值对迭代器与Vec的元素迭代器配对 for ((k, v), c) in a.into_iter().zip(b.into_iter()) { println!("{}, {}, {}", k, v, c); } }
关键说明
into_iter()会消耗原集合(BTreeMap和Vec),返回元素的所有权。如果不想消耗原集合,改用iter()获取引用迭代器,代码依然可以正常运行:for ((&k, &v), &c) in a.iter().zip(b.iter()) { println!("{}, {}, {}", k, v, c); }zip方法会按顺序将两个迭代器的元素一一配对,当其中任意一个迭代器耗尽时,遍历立即停止。如果两个集合的元素数量不一致,只会遍历到较短集合的长度。
内容的提问来源于stack exchange,提问作者Loaf
相关产品推荐
相关产品推荐

