RBF*_*F06 2 iterator slice rust
PartialEq我有一个在切片中实现的类型的元素序列。为了便于说明,我们假设它看起来像这样:
let data = [1,1,1,2,2,3,4,5,5,5,5,6];
Run Code Online (Sandbox Code Playgroud)
我想迭代这个序列的借用切片,以便这些切片的所有元素都相等PartialEq。例如,在上面的切片中,data我想要一个迭代器,它会产生:
&data[0..3] // [1,1,1]
&data[3..5] // [2,2]
&data[5..6] // [3]
&data[6..7] // [4]
&data[7..11] // [5,5,5,5]
&data[11..12] // [6]
Run Code Online (Sandbox Code Playgroud)
看起来slice::group_by正是我所需要的,但从 Rust 1.72.0 开始,它还不稳定。是否有任何简单的方法可以通过使用第 3 方板条箱或结合使用稳定的 std lib API 以稳定的方式获得此功能?
group_by是一个非常简单的函数。它返回一个具有以下 next实现的迭代器:
fn next(&mut self) -> Option<Self::Item> {
if self.slice.is_empty() {
None
} else {
let mut len = 1;
let mut iter = self.slice.windows(2);
while let Some([l, r]) = iter.next() {
if (self.predicate)(l, r) { len += 1 } else { break }
}
let (head, tail) = self.slice.split_at(len);
self.slice = tail;
Some(head)
}
}
Run Code Online (Sandbox Code Playgroud)
由于您有一个简单的谓词,因此您可以创建一个from_fn更短的迭代器。
fn group_by<T: PartialEq>(mut slice: &[T]) -> impl Iterator<Item = &[T]> + '_ {
std::iter::from_fn(move || {
let first = slice.first()?;
let len = slice.iter().position(|t| first != t).unwrap_or(slice.len());
let (head, tail) = slice.split_at(len);
slice = tail;
Some(head)
})
}
Run Code Online (Sandbox Code Playgroud)
此方法与调用之间的唯一区别group_by(|a, b| a == b)在于,此方法检查与第一个元素的相等性,这可能会为非类型提供不同的结果Eq。windows如果这对您很重要,您可以从每晚返回该方法group_by。
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |