11个版本
0.3.1 | 2023年5月3日 |
---|---|
0.3.0 | 2021年10月12日 |
0.2.7 |
|
0.2.6 | 2019年7月20日 |
0.1.0 | 2019年1月30日 |
#60 in 算法
586,998 每月下载量
用于 442 个crate(直接使用11个)
110KB
2.5K SLoC
slice-group-by
是Haskell函数groupBy
的一个实现,提供工具以高效地对根据函数定义的两个元素是否属于同一组来分组的slice
和str
进行迭代。
与Itertools::group_by
的区别
Itertools::group_by
方法使用一个键来比较元素,这个库的工作方式类似于slice::sort_by
,它使用一个比较函数。它适用于任何Iterator
类型,而slice-group-by
仅与slice
和str
一起工作,这是该库的优势,它因为数据局部性而快速。
此外,slice-group-by
还支持多种搜索算法(例如线性搜索、二分搜索和指数搜索)并可以从末尾开始返回组。
示例
线性搜索不可变组
您只需定义一个函数,如果两个元素属于同一组则返回true
。
LinearGroupBy
迭代器始终将连续元素传递给谓词函数。
use slice_group_by::GroupBy;
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
let mut iter = slice.linear_group_by(|a, b| a == b);
assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
assert_eq!(iter.next(), Some(&[3, 3][..]));
assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
assert_eq!(iter.next(), None);
线性搜索不可变str组
您只需定义一个函数,如果两个字符属于同一组则返回true
。
LinearStrGroupBy
迭代器始终将连续字符传递给谓词函数。
use slice_group_by::StrGroupBy;
let string = "aaaabbbbb饰饰cccc";
let mut iter = string.linear_group_by(|a, b| a == b);
assert_eq!(iter.next(), Some("aaaa"));
assert_eq!(iter.next(), Some("bbbbb"));
assert_eq!(iter.next(), Some("饰饰"));
assert_eq!(iter.next(), Some("cccc"));
assert_eq!(iter.next(), None);
二分搜索可变组
还可以获取切片的可变非重叠组。
BinaryGroupBy/Mut
和 ExponentialGroupBy/Mut
迭代器并不一定会给谓词函数提供连续元素。谓词函数应实现与切片排序顺序一致的顺序。
use slice_group_by::GroupByMut;
let slice = &mut [1, 1, 1, 2, 2, 2, 3, 3];
let mut iter = slice.binary_group_by_mut(|a, b| a == b);
assert_eq!(iter.next(), Some(&mut [1, 1, 1][..]));
assert_eq!(iter.next(), Some(&mut [2, 2, 2][..]));
assert_eq!(iter.next(), Some(&mut [3, 3][..]));
assert_eq!(iter.next(), None);
从末尾开始的指数搜索可变组
即使从切片的末尾开始,也可以获取切片的可变非重叠组。
use slice_group_by::GroupByMut;
let slice = &mut [1, 1, 1, 2, 2, 2, 3, 3];
let mut iter = slice.exponential_group_by_mut(|a, b| a == b).rev();
assert_eq!(iter.next(), Some(&mut [3, 3][..]));
assert_eq!(iter.next(), Some(&mut [2, 2, 2][..]));
assert_eq!(iter.next(), Some(&mut [1, 1, 1][..]));
assert_eq!(iter.next(), None);