Вопрос по algorithm, text, sorting, numbers – Сортировка строк, содержащих числа, в удобной для пользователя форме

16

Привыкнув к стандартному способу сортировки строк, я удивился, когда заметил, что Windows сортирует файлы по их именам в некотором продвинутом виде. Позволь мне привести пример:

Track1.mp3
Track2.mp3
Track10.mp3
Track20.mp3

Я думаю, что эти имена сравниваются (при сортировке) по буквам и числам отдельно.

С другой стороны, следующий список тот же самый, отсортированный стандартным способом:
Track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3

Я хотел бы создать алгоритм сравнения в Delphi, который позволил бы мне сортировать строки таким же образом. Сначала я подумал, что будет достаточно сравнить последовательные символы двух строк, пока они являются буквами. Когда в некоторой позиции обеих строк будет найдена цифра, я прочитаю все цифры, следующие за ними, чтобы сформировать число, а затем сравню числа.

Для примера приведу сравнение «Track10». и & quot; Track2 & quot; Строки таким образом:
1) читать символы, когда они равны и когда они являются буквами: & quot; Track & quot ;, & quot; Track & quot;
2) если найдена цифра, прочитайте все следующие цифры: «10», «2»;
2a) если они равны, переходите к 1 или закончите
Десять больше двух, так что "Track10" больше, чем "Track2"

Казалось, что все будет в порядке, пока я не заметил во время моих тестов, что Windows считает "Track010" ниже, чем "Track10", хотя я думал, что первый был больше, поскольку он был длиннее (не говоря уже о том, что в соответствии с моим алгоритмом обе строки будут равны, что неправильно).

Не могли бы вы дать мне идею, как именно Windows сортирует файлы по именам, или, может быть, у вас есть готовый алгоритм (на любом языке программирования), на котором я мог бы основываться?

Большое спасибо!
Мариуш

Смотри этоstackoverflow.com/questions/31538293/… Nanokaso Gongon
Извините, но я даже не знал, какую фразу искать раньше. Вот почему я невольно продублировал этот вопрос. Теперь я знаю, что этот способ сортировки называется «естественная сортировка», поэтому я могу самостоятельно искать дополнительную информацию о нем. Mariusz Schimke
Dupe многих других вопросов, в том числе:stackoverflow.com/questions/34518/natural-sorting-algorithm Mehrdad Afshari
Дубликатstackoverflow.com/q/248603/24874 (имеет несколько хороших ответов) Drew Noakes

Ваш Ответ

3   ответа
1

что абсолютно простым способом было изолировать нужную строку, поэтому в случае с OP Path.GetFileNameWithoutExtension () удалите нецифровые символы, преобразуйте в int и выполните сортировку. Используя LINQ и некоторые способы расширени, он вл етс однострочным. В моем случае я собирался по каталогам:

Directory.GetDirectories(@"a:\b\c").OrderBy(x => x.RemoveNonDigits().ToIntOrZero())

Где RemoveNonDigits и ToIntOrZero являются методами расширений:

public static string RemoveNonDigits(this string value) {
    return Regex.Replace(value, "[^0-9]", string.Empty);
}

public static int ToIntOrZero(this string toConvert) {
    try {
        if (toConvert == null || toConvert.Trim() == string.Empty) return 0;            
        return int.Parse(toConvert);
    } catch (Exception) {
        return 0;
    }
}

Методы расширения являются общими инструментами, которые я использую везде. YMMV.

Очень хороший обходной путь. Работал на меня! Спасибо!
0

ls '*.mp3' | sort --version-sort

20

естественная сортировкагде вы эффективно обрабатываете группу цифр как один «символ». Существуют реализации на каждом языке под солнцем, но, как ни странно, они обычно не встроены в большинство языков ». стандартные библиотеки.

Вот реализация PHP:natsort
Спасибо за подсказку. Мне удалось найти функцию Windows API StrCmpLogicalW (msdn.microsoft.com/en-us/library/bb759947.aspx) что я и искал. Mariusz Schimke

Похожие вопросы