Метод сортировки проводника Windows - PullRequest
19 голосов
/ 14 января 2009

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

name 1, name 2, name 10

вместо

name 1, name 10, name 2

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

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

name 00001, name 00010, name 00002

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

Есть идеи?

Ответы [ 8 ]

15 голосов
/ 14 января 2009

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

6 голосов
/ 14 января 2009

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

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

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

3 голосов
/ 14 января 2009

Существует StrCmpLogicalW , но он доступен только начиная с Windows XP и реализован только в Unicode.

Некоторая справочная информация: http://www.siao2.com/2006/10/01/778990.aspx

1 голос
/ 13 августа 2011

Я разместил код (C #) и описание алгоритма здесь:

Естественный порядок сортировки в C #

1 голос
/ 14 января 2009

Я также опубликовал связанный вопрос с дополнительными подсказками и подводными камнями:

Сортировка строк намного сложнее, чем вы думали

1 голос
/ 14 января 2009

Посмотрите на

http://www.interact -sw.co.uk / iangblog / 2007/12/13 / натуральный сортировочный

для некоторого исходного кода.

1 голос
/ 14 января 2009

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

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

0 голосов
/ 15 мая 2014

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

Java - сортировка строк, таких как Windows Explorer

Короче говоря, он разделяет две строки для сравнения по буквенно-цифровым частям и сравнивает эти части определенным образом для достижения такой сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...