rust - 迭代两个不同长度的向量

标签 rust

我有两个Vec,它们可以有不同的长度,例如:

let xs = vec![1, 2, 3, 4, 5];
let ys = vec![11, 12, 13];

我想成对迭代它们,打印:

x=1, y=11
x=2, y=12
x=3, y=13
x=4; no matching Y
x=5; no matching Y

我可以使用 Iterator::zipxsys 中获取具有匹配元素的对:

for (x, y) in xs.iter().zip(ys.iter()) {
    println!("x={}, y={}", x, y);
}

但对于“不匹配”的位,我需要复杂的代码来检查长度并获取其余部分。

我想要一个完全基于迭代器的解决方案,所以我尝试了:

let mut it_xs = xs.iter();
let mut it_ys = ys.iter();
while let (Some(x), Some(y)) = (it_xs.next(), it_ys.next()) {
    println!("x={}, y={}", x, y);
}
while let Some(x) = it_xs.next() {
    println!("x={}, no matching Y", x);
}
while let Some(y) = it_ys.next() {
    println!("y={}, no matching X", y);
}

这不能正常工作,因为第一个循环会跳过另一个列表中没有匹配项的第一个元素 (x=4)。

是否有可能在迭代器的帮助下解决而不对较大的 Vec 的其余部分进行切片?

最佳答案

没有外部 crates 的实现:

let mut it_xs = xs.iter();
let mut it_ys = ys.iter();
loop {
    match (it_xs.next(), it_ys.next()) {
        (Some(x), Some(y)) => println!("x={}, y={}", x, y),
        (Some(x), None) => println!("x={}, no matching Y", x),  
        (None, Some(y)) => println!("y={}, no matching X", y), 
        (None, None) => break,
    }
}

关于rust - 迭代两个不同长度的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38163675/

相关文章:

rust - 我的空 Rust 项目无法编译,我该怎么办?

rust - Rayon 折叠成一个 HashMap

rust - 无法将数组传递给具有任意长度切片的 From 特征

generics - 如果我已经为 U 实现了 From<T>,Rust 是否为 Vec<U> 实现了 From<Vec<T>>?

rust - 如何在升级到 Rust Clap v4 时更改 .multiple

rust - Bindgen 似乎无法在 OSX 上找到 clang

rust - 如何实现返回带有生命周期参数的引用的 FnMut?

rust - 在循环中构建 std::process::Command 时类型不匹配

rust - Rust 的 glob 函数代表什么时间点?

rust - 返回位置具有通用关联类型的Impl特征导致生命周期错误