微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rust 迭代器类似于 chunks()

如何解决Rust 迭代器类似于 chunks()

这个迭代器

let data = vec![0,1,2,3,4,5];

for x in data.chunks(2) {
    println!("{:?}",x);
}

会产生

[0,1]
[2,3]
[4,5]

我可以使用迭代器来得到这样的东西吗。

[0,1]
[1,2]
[2,3]
[3,4]
[4,5]

我知道如何使用 for 循环来做到这一点。但是迭代器可以做得更好吗?

解决方法

我想您可以使用 Itertools.tuple_windows 来实现这一点。根据文档,它“在所有连续窗口上返回一个迭代器,生成特定大小的元组(最多 4 个)”

use itertools::Itertools;
use itertools::TupleWindows;
use std::slice::Iter;

let data = vec![0,1,2,3,4,5];

let it: TupleWindows<Iter<'_,i32>,(&i32,&i32)> = data.iter().tuple_windows();

for elem in it {
    println!("{:?}",elem);
}

输出:

(0,1)
(1,2)
(2,3)
(3,4)
(4,5)

编辑: 正如@Masklinn 的 comment1 和@SebastianRedl 的 comment2 所述,您还可以使用 stdlib 中的 windows 并避免在项目中包含 Itertools。但请注意,它仅适用于切片(或强制切片的事物),不适用于通用迭代器(这对您来说很好)。

let data = vec![0,5];

let it = data.windows(2);

for elem in it {
    println!("{:?}",elem);
}

输出:

[0,1]
[1,2]
[2,3]
[3,4]
[4,5]
,

或者,无需额外依赖,您可以压缩同一个迭代器,跳过第二个项目的一项。

fn main() {
    let data = vec![0,5];
    let i1 = data.iter();
    let i2 = data.iter();
    for (a,b) in i1.zip(i2.skip(1)) {
        println!("{} {}",a,b);
    }
}

Playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。