如何在稳定版Rust中迭代切片的相等元素连续子序列?
在Rust稳定版中实现连续相等元素的切片分组
使用第三方库
可以直接使用slice_group_by crate,它专门提供了稳定版的切片分组功能,完全匹配你的需求。
添加依赖到Cargo.toml:
[dependencies] slice_group_by = "0.3"
使用示例:
use slice_group_by::GroupBy; fn main() { let data = [1,1,1,2,2,3,4,5,5,5,5,6]; let groups = data.group_by(|a, b| a == b); for group in groups { println!("{group:?}"); } }
运行后会输出你期望的各个子切片:[1, 1, 1]、[2, 2]、[3]、[4]、[5, 5, 5, 5]、[6]。
手动实现(基于标准库)
如果不想引入第三方依赖,可通过标准库API手动实现该逻辑,核心思路是跟踪当前分组的起始索引,遍历切片找到连续相等元素的结束位置,生成对应子切片:
fn group_equal_elements<T: PartialEq>(slice: &[T]) -> impl Iterator<Item = &[T]> { let mut start = 0; std::iter::from_fn(move || { if start >= slice.len() { return None; } let current = &slice[start]; // 找到第一个不等于当前元素的位置,确定分组结束索引 let end = slice[start..] .iter() .position(|elem| elem != current) .map_or(slice.len(), |pos| start + pos); let group = &slice[start..end]; start = end; Some(group) }) } fn main() { let data = [1,1,1,2,2,3,4,5,5,5,5,6]; for group in group_equal_elements(&data) { println!("{group:?}"); } }
内容的提问来源于stack exchange,提问作者RBF06
相关产品推荐
相关产品推荐

