#file-sorting #sorting #path #file-path #alphanumeric #file

no-std alphanumeric-sort

This crate can help you sort order for files and folders whose names contain numerals

30 stable releases

1.5.3 Nov 26, 2023
1.5.1 Mar 22, 2023
1.4.4 Mar 5, 2022
1.4.3 Apr 21, 2021
1.0.6 Nov 13, 2018

#156 in Algorithms

Download history 2990/week @ 2023-12-23 3869/week @ 2023-12-30 5901/week @ 2024-01-06 6942/week @ 2024-01-13 6160/week @ 2024-01-20 5806/week @ 2024-01-27 5960/week @ 2024-02-03 5373/week @ 2024-02-10 5728/week @ 2024-02-17 5702/week @ 2024-02-24 7260/week @ 2024-03-02 6586/week @ 2024-03-09 6365/week @ 2024-03-16 6375/week @ 2024-03-23 6979/week @ 2024-03-30 5595/week @ 2024-04-06

26,407 downloads per month
Used in 38 crates (23 directly)

MIT license

30KB
643 lines

Alphanumeric Sort

CI

This crate can help you sort order for files and folders whose names contain numerals.

Motives and Examples

With the Rust native sort method, strings and paths are arranged into lexicographical order. In some cases, it is not so intuitive. For example, there are screen snap shots named by shot-%N like shot-2, shot-1, shot-11. After a lexicographical sorting, they will be ordered into shot-1, shot-11, shot-2. However, we would prefer shot-1, shot-2, shot-11 mostly.

let mut names = ["shot-2", "shot-1", "shot-11"];

names.sort();

assert_eq!(["shot-1", "shot-11", "shot-2"], names);

Thus, in this kind of case, an alphanumeric sort might come in handy.

let mut names = ["shot-2", "shot-1", "shot-11"];

alphanumeric_sort::sort_str_slice(&mut names);

assert_eq!(["shot-1", "shot-2", "shot-11"], names);
use std::path::Path;

let mut paths = [Path::new("shot-2"), Path::new("shot-1"), Path::new("shot-11")];

alphanumeric_sort::sort_path_slice(&mut paths);

assert_eq!([Path::new("shot-1"), Path::new("shot-2"), Path::new("shot-11")], paths);

About the compare_* Functions and the sort_* Functions

To sort a slice, the code can also be written like,

use std::path::Path;

let mut paths = [Path::new("shot-2"), Path::new("shot-1"), Path::new("shot-11")];

paths.sort_by(|a, b| alphanumeric_sort::compare_path(a, b));

assert_eq!([Path::new("shot-1"), Path::new("shot-2"), Path::new("shot-11")], paths);

But it is not recommended because the compare_* functions try to convert data (e.g Path, CStr) to &str every time in its execution and thus they are slower than the sort_* functions when sorting a slice.

Version 1.3 to 1.4

No breaking change in API is made, though the order has some changes.

  • "0001" is greater than "001" instead of being equal.
  • "" is greater than "1" instead of being less. "第1章" is still less than "第1-2章", even though "" is greater than "-".

No Std

Disable the default features to compile this crate without std.

[dependencies.alphanumeric-sort]
version = "*"
default-features = false

Benchmark

cargo bench

Crates.io

https://crates.io/crates/alphanumeric-sort

Documentation

https://docs.rs/alphanumeric-sort

License

MIT

No runtime deps