#group #slice #str #string #array-string

无需std slice-group-by

切片和strs中分组的迭代器

11个版本

0.3.1 2023年5月3日
0.3.0 2021年10月12日
0.2.7 2021年2月13日
0.2.6 2019年7月20日
0.1.0 2019年1月30日

#60 in 算法

Download history 119129/week @ 2024-04-20 103815/week @ 2024-04-27 109638/week @ 2024-05-04 129050/week @ 2024-05-11 114926/week @ 2024-05-18 128737/week @ 2024-05-25 123775/week @ 2024-06-01 116167/week @ 2024-06-08 130661/week @ 2024-06-15 120272/week @ 2024-06-22 119457/week @ 2024-06-29 131032/week @ 2024-07-06 149045/week @ 2024-07-13 141286/week @ 2024-07-20 134292/week @ 2024-07-27 137995/week @ 2024-08-03

586,998 每月下载量
用于 442 个crate(直接使用11个)

MIT 协议

110KB
2.5K SLoC

slice-group-by

slice-group-by crate slice-group-by documentation dependency status build & tests worflow License

是Haskell函数groupBy的一个实现,提供工具以高效地对根据函数定义的两个元素是否属于同一组来分组的slicestr进行迭代。

Itertools::group_by的区别

Itertools::group_by方法使用一个键来比较元素,这个库的工作方式类似于slice::sort_by,它使用一个比较函数。它适用于任何Iterator类型,而slice-group-by仅与slicestr一起工作,这是该库的优势,它因为数据局部性而快速。

此外,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/MutExponentialGroupBy/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);

无运行时依赖