Подтвердить что ты не робот

Метод сортировки Windows Explorer

Я ищу алгоритм, который сортирует строки, похожие на способ сортировки файлов (и папок) в проводнике Windows. Кажется, что числовые значения в строках учитываются при сортировке, что приводит к чему-то вроде

name 1, name 2, name 10

вместо

name 1, name 10, name 2

который вы получаете с регулярным сопоставлением строк.

Я собирался начать писать это сам, но хотел проверить, кто-то сделал это раньше, и был готов поделиться каким-то кодом или соображениями. Способ, которым я хотел бы приблизиться к этому, заключался бы в том, чтобы добавить перед началом сравнения нулевые значения в числовые значения в имени. Это приведет к чему-то вроде

name 00001, name 00010, name 00002

который при сортировке с регулярной сортировкой строк даст мне правильный результат.

Любые идеи?

4b9b3361

Ответ 1

Он называется "порядок естественного порядка". У Джеффа была довольно обширная запись в блоге, которая описывает трудности, которые вы можете упустить, и имеет ссылки на несколько реализаций.

Ответ 2

Проводник использует API StrCmpLogicalW() для такого рода сортировки (называемый "порядок естественной сортировки" ).

Вам не нужно писать собственную функцию сравнения, просто используйте ту, которая уже существует.

Хорошее объяснение можно найти здесь.

Ответ 4

Как я понял, Windows Explorer сортируется в соответствии с вашим вторым примером - он всегда очень раздражал меня, что заказ выходит 1, 10, 2. Поэтому большинство приложений, которые пишут много файлов (например, пакетные приложения), всегда используют имена файлов фиксированной длины с ведущим 0 или любым другим.

Ваше решение должно работать, но вам нужно быть осторожным там, где номера были в имени файла, и, вероятно, использовать ваш подход только в том случае, если они находятся в самом конце.

Ответ 8

Это попытка реализовать его в Java:

Java - Сортировка строк, таких как проводник Windows

Короче говоря, он разделяет две строки для сравнения в Letter-Digit Parts и сравнивает эти части определенным образом для достижения такого рода сортировки.