sharkLoc 发表于 2022-11-03 22:51
Tags:多行迭代器
问题如题哈,我现在有一个文件,文件每两行为一个小单元;综合两行信息,决定这两行信息是否被剔除,不知道如何构建这样的迭代器,望各位前辈指点下,有简单思路就行,先谢谢啦!
多谢大佬!
-- 👇 苦瓜小仔: 构造两个迭代器意味着读取文件两次。
读取一次的话,除了一楼给的 Itertools::tuple 方法,还可以用 Iterator::next_chunk:
Itertools::tuple
Iterator::next_chunk
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=7c9a7405083ec419379bb01d20b10e17
除此之外,还可以用模式匹配来处理这种情况 : )
let lines = vec![1, 2, 3, 4]; let mut left = &lines[..]; while let [line_1, line_2, x @ ..] = left { left = x; println!("{line_1}, {line_2}"); println!("left = {:?}", left); }
struct DoubleIterator<T, I: Iterator<Item=T>>(I); impl<T, I: Iterator<Item=T>> Iterator for DoubleIterator<T, I> { type Item = [T; 2]; fn next(&mut self) -> Option<Self::Item> { let i1 = self.0.next(); if i1.is_none() { return None; } let i2 = self.0.next(); if i2.is_none() { return None; } return Some([i1.unwrap(), i2.unwrap()]); } }
构造两个迭代器意味着读取文件两次。
谢谢,感觉可行
-- 👇 MrZLeo: 我的想法是,首先构造两个迭代器,一个是单数行,一个是双数行(用step实现)。然后把两个迭代器zip起来,接着用filter过滤你不想要的行,最后for_each把成组的两行按顺序插入一个Vec就可以了。
step
zip
filter
for_each
Vec
我的想法是,首先构造两个迭代器,一个是单数行,一个是双数行(用step实现)。然后把两个迭代器zip起来,接着用filter过滤你不想要的行,最后for_each把成组的两行按顺序插入一个Vec就可以了。
谢谢,但是buffer迭代器好像不支持这样的操作。
-- 👇 Easonzero: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d91527871d0aabf2814846522072d231
把下坐标移到下一个开始不就可以了
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d91527871d0aabf2814846522072d231
评论区
写评论多谢大佬!
--
👇
苦瓜小仔: 构造两个迭代器意味着读取文件两次。
读取一次的话,除了一楼给的
Itertools::tuple
方法,还可以用Iterator::next_chunk
:https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=7c9a7405083ec419379bb01d20b10e17
除此之外,还可以用模式匹配来处理这种情况 : )
构造两个迭代器意味着读取文件两次。
读取一次的话,除了一楼给的
Itertools::tuple
方法,还可以用Iterator::next_chunk
:https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=7c9a7405083ec419379bb01d20b10e17
谢谢,感觉可行
--
👇
MrZLeo: 我的想法是,首先构造两个迭代器,一个是单数行,一个是双数行(用
step
实现)。然后把两个迭代器zip
起来,接着用filter
过滤你不想要的行,最后for_each
把成组的两行按顺序插入一个Vec
就可以了。我的想法是,首先构造两个迭代器,一个是单数行,一个是双数行(用
step
实现)。然后把两个迭代器zip
起来,接着用filter
过滤你不想要的行,最后for_each
把成组的两行按顺序插入一个Vec
就可以了。谢谢,但是buffer迭代器好像不支持这样的操作。
--
👇
Easonzero: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d91527871d0aabf2814846522072d231
把下坐标移到下一个开始不就可以了
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d91527871d0aabf2814846522072d231