#sorting #transliteration #lexicographical #no-std

no-std lexical-sort

按字典顺序排序 Unicode 字符串

5 个不稳定版本

0.3.1 2020 年 8 月 29 日
0.3.0 2020 年 6 月 20 日
0.2.1 2020 年 6 月 19 日
0.2.0 2020 年 6 月 15 日
0.1.0 2020 年 6 月 15 日

#472 in 文本处理

Download history 17694/week @ 2023-11-18 14130/week @ 2023-11-25 17978/week @ 2023-12-02 10763/week @ 2023-12-09 12829/week @ 2023-12-16 5997/week @ 2023-12-23 16521/week @ 2023-12-30 10495/week @ 2024-01-06 18530/week @ 2024-01-13 15623/week @ 2024-01-20 14066/week @ 2024-01-27 14965/week @ 2024-02-03 12421/week @ 2024-02-10 11531/week @ 2024-02-17 9613/week @ 2024-02-24 12399/week @ 2024-03-02

47,203 每月下载量
用于 80 个 crate (15 直接)

MIT/Apache

64KB
610

lexical-sort

这是一个用于比较和按字典顺序排序字符串(或文件路径)的库。这意味着非 ASCII 字符,如 áß,被当作它们最近的 ASCII 字符对待:á 被当作 aß 被当作 ss,等等。

字典比较不区分大小写。字母数字字符在所有其他字符(标点符号、空白、特殊字符、表情符号等)之后排序。

可以启用 自然排序,它还处理 ASCII 数字。例如,在启用自然排序的情况下,50 小于 100。还可以跳过非字母数字字符,例如,f-5 排在 f5 旁边。

如果不同的字符串具有相同的 ASCII 表示(例如,"Foo""fóò"),则回退到标准库中的默认方法,因此排序是确定的。

注意:此 crate 不试图为每个地区都正确无误,但它应该适用于广泛的地区,同时提供出色的性能。

用法

要排序字符串或路径,可以使用 StringSortStringSort trait

use lexical_sort::{StringSort, natural_lexical_cmp};

let mut strings = vec!["ß", "é", "100", "hello", "world", "50", ".", "B!"];
strings.string_sort_unstable(natural_lexical_cmp);

assert_eq!(&strings, &[".", "50", "100", "B!", "é", "hello", "ß", "world"]);

有八个比较函数

函数 lexico­graphical natural 跳过非字母数字字符
cmp
only_alnum_cmp yes
lexical_cmp yes
lexical_only_alnum_cmp yes yes
natural_cmp yes
natural_only_alnum_cmp yes yes
natural_lexical_cmp yes yes
natural_lexical_­only_alnum_cmp yes yes yes

注意,只有按字典顺序排序的函数才不区分大小写。

特性

所有比较函数构成一个 全序。只有当两个字符串由完全相同的 Unicode 代码点组成时,它们才被认为是相等的。

性能

该算法使用迭代器,从不分配堆内存。它针对主要由 ASCII 字符组成的字符串进行了优化;对于仅包含 ASCII 字符的字符串,字典比较函数的速度仅比 std 中的默认方法慢 2 到 3 倍,后者仅比较 Unicode 代码点。

请注意,对于在转换为小写ASCII后,开头许多字符相同的字符串,比较速度较慢。

基准测试

这些基准测试是在搭载4个3.1GHz的AMD A8-7600 Radeon R7 CPU上执行的。

  • 第一个基准测试比较了100个随机生成的5到20个字符的字符串,包含ASCII和非ASCII字符。
  • 第二个基准测试也比较了100个随机生成的5到20个字符的字符串,但它们是纯ASCII字符。
  • 最后一个基准测试比较了100个随机生成的字符串,每个字符串由"T-"后跟1到8位十进制数字组成。这是对自然排序的压测。

第一个、灰色条形来自提供对icu C库绑定的rust_icu crate。它为英语执行“正确”的排序。在许多情况下,它更快,因为它在事先生成搜索键以减少总工作量。

最后一个、深蓝色条形是标准库中的字符串比较函数。

Diagrams

no_std 支持

此crate支持no_std环境。请注意,您必须禁用默认功能才能在没有标准库的情况下编译。

此crate目前不需要分配器,尽管这可能会在未来改变。

贡献

欢迎贡献、错误报告和功能请求!

如果缺少对某些字符的支持,您可以将其贡献给any_ascii crate。

许可证

本项目双授权于MITApache 2.0许可证。使用您喜欢的任意一个。

依赖

~240KB