【问题标题】:Use all but the last element from an iterator使用迭代器中除最后一个元素之外的所有元素
【发布时间】:2018-06-14 14:53:04
【问题描述】:

我想将Vec 分割成一些长度相等的部分,然后将map 分割开来。我有一个由调用Vecchunks() 方法产生的迭代器。这可能会给我留下一个比其他部分更小的部分,这将是它生成的最后一个元素。

为了确保所有部分的长度相等,我只想删除最后一个元素,然后在剩下的部分调用 map()

【问题讨论】:

  • 虽然有更好的解决方案适合您的情况,但请注意std::iter::take的存在

标签: iterator rust


【解决方案1】:

作为Sebastian Redl points out,检查每个块的length 是针对您的特定情况的更好解决方案。

要回答您提出的问题(“使用迭代器中除最后一个元素之外的所有元素”),您可以使用Iterator::peekable 向前看。这将告诉您是否在最后一个项目上,如果是,您可以决定跳过处理它。

let things = [0, 1, 2, 3, 4];

let mut chunks = things.chunks(2).peekable();
while let Some(chunk) = chunks.next() {
    if chunks.peek().is_some() {
        print!("Not the last: ");
    } else {
        print!("This is the last: ")
    }

    println!("{:?}", chunk);
}

为了确保所有部分的长度相等,我只想删除最后一个元素

总是删除最后一个元素不会这样做。例如,如果你均匀地分块输入,那么总是删除最后一个元素会丢失一个完整的块。你必须做一些预先计算来决定你是否需要放弃它。

【讨论】:

    【解决方案2】:

    您可以 filter() 切片上的块迭代器 len() 是您传递给 chunks() 的数量:

    let things = [0, 1, 2, 3, 4];
    
    for chunk in things.chunks(2).filter(|c| c.len() == 2) {
        println!("{:?}", chunk);
    }
    

    从 Rust 1.31 开始,您也可以使用 chunks_exact 方法:

    let things = [0, 1, 2, 3, 4];
    
    for chunk in things.chunks_exact(2) {
        println!("{:?}", chunk);
    }
    

    请注意,返回的迭代器也有 remainder 方法,如果您需要在最后获取不均匀数量的项目。

    【讨论】:

    • 那就更明确了。谢谢!
    • 您还可以将输入切片为块大小的倍数,并避免在每个步骤中进行检查。
    猜你喜欢
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2011-01-24
    • 2011-02-04
    相关资源
    最近更新 更多