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

a0x5cqrl  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(117)

我有两个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::zip来获取xsys中具有匹配元素的对:

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的其余部分进行切片?

j2cgzkjk

j2cgzkjk1#

无外部板条箱的实施:

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,
    }
}

字符串

i34xakig

i34xakig2#

itertools有一个方法zip_longest,它就是这样做的:

use itertools::Itertools;
use itertools::EitherOrBoth::{Both, Left, Right};

for it in xs.iter().zip_longest(ys.iter()) {
    match it {
        Both(x, y) => println!("x={}, y={}", x, y),
        Left(x) => println!("x={}, no matching Y", x),
        Right(y) => println!("y={}, no matching X", y),
    }
}

字符串

相关问题