首页 > 解决方案 > 是否可以连接迭代器?

问题描述

let vec = iter::repeat("don't satisfy condition 1") // iterator such as next() always "don't " satisfy condition 1"
    .take_while(|_| {
        satisfycondition1.satisfy() // true is condition 1 is satisfied else false
    })
    .collect();

此代码创建一个n元素向量,该向量n等于不遵守条件 1 的次数。

我现在想创建一个n + m元素向量,其n等于不遵守条件 1m的次数和不遵守条件 2 的次数。

代码应该类似于这样:

let vec = iter::repeat("dont't satisfy condition 1")
    .take_while(|_| {
        satisfycondition1.satisfy() 
    })
    .union(
        iter::repeat("has satisfed condition 1 but not 2 yet")
        .take_while(|_| {
            satisfycondition2.satisfy() 
        })
    )
    .collect();

我知道我可以创建两个向量,然后将它们连接起来,但效率较低。

您可以使用此代码来了解重复的内容:

use  std::iter;

fn main() {
    let mut c = 0;
    let z: Vec<_> = iter::repeat("dont't satisfy condition 1")
        .take_while(|_| {
            c = c + 1;
            let rep = if c < 5 { true } else { false };
            rep
        })
        .collect();
    println!("------{:?}", z);
}

标签: rustiterator

解决方案


这似乎std::iter::chain是您正在寻找的东西。

use std::iter;

fn main() {
    let mut c = 0;
    let mut d = 5;
    let z: Vec<_> = iter::repeat("don't satisfy condition 1")
        .take_while(|_| {
            c = c + 1;
            let rep = if c < 5 { true } else { false };
            rep
            // this block can be simplified to
            // c += 1;
            // c < 5
            // Clippy warns about this
        })
        .chain(
            iter::repeat("satisfy condition 1 but not 2").take_while(|_| {
                d -= 1;
                d > 2
            }),
        )
        .collect();
    println!("------{:?}", z);
}

(游乐场链接)

不过,我无法评论您的代码的语义。如果您试图查看迭代器的哪些元素“满足条件 1 但不满足条件 2”,那么您不会这样做。您将使用std::iter::filter两次(一次使用条件 1,一次使用非条件 2)来实现这一目标。


推荐阅读