| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > Как отсортировать строки нужным мне образом? |
| Автор: ДЫМ 26.6.2006, 01:15 |
| У меня есть список строк (если кому интересно, номера домов) 2 10 2а 1а 1 110 20 1б Мне надо их отсортировать, чтобы список выглядел так 1 1а 1б 2 2а 10 20 110 Я знаю, что это возможно, потому что Total Commander, например, файлы с такими именами сорирует как мне надо, но метод TStringList.Sort выдает такой результат 1 10 110 1а 1б 2 20 2а Как мне поступить? Подскажите, очень надо. |
| Автор: Демо 26.6.2006, 01:55 |
| ДЫМ, Используй метод TStringList.CustomSort |
| Автор: Poseidon 26.6.2006, 03:18 | ||
Использован http://forum.vingrad.ru/index.php?showtopic=3202&view=findpost&p=15643
Код написан безобразно, т.к. уже 3 часа ночи |
| Автор: ДЫМ 27.6.2006, 02:05 |
| Poseidon, за ночную работу держи "плюсик", для моей задачи худо-бедно сгодится. Но вот не дает мне покоя Total Commander, как сортирует хорошо зараза, но как это делает - не понятно. Ну скажите, как получить такой же порядок строк: Строка №1 Строка №1а Строка №1аб Строка №2 Строка №10 Строка №20 Строка №110 или 1/1 1/2 1/10 Раз смогли авторы Total Commander`а, то ведь можно разгадать это? Или нет? |
| Автор: comtat 27.6.2006, 12:00 | ||
| ДЫМ, берешь строку выкидываешь из нее например "Строка №" и делаешь как в предыдушем примере А потом при
Вот и все.... |
| Автор: ДЫМ 27.6.2006, 21:33 |
| Пример Poseidon не работает для набора 1/1 1/2 1/10 да и вообще нужно что-то универсальное, а оно есть... |
| Автор: Akina 27.6.2006, 21:50 |
| Следует разделить строку на кванты и сортировать уже их. Скажем строка Строка №1аб делится на кванты q1 = Строка № q2 = 1 q3 = аб и далее order by q1 as string, q2 as integer, q3 as string Аналогично строка 1/10 делится на кванты q1 = 1 q2 = / q3 = 10 и далее order by q1 as integer, q3 as integer |
| Автор: LesnoyChelovek 27.6.2006, 22:14 |
| Я вот думаю, что можно для сортировки использовать таблицу ASCII. ПОка не знаю как, но может додумаюсь, так код выложу. Примерные набросок, смотрим число, после него встречаем букву и сравниваем ASCII код последующих букв. |
| Автор: ДЫМ 28.6.2006, 01:48 |
| Akina , но как же определить где кончается один квант и начинается другой? Выходит что надо разделить строку на цепочки букв и цифр, последние надо рассматривать как числа и соответственно сортировать как числа, так что ли? А это что за строка? Напоминает SQL order by q1 as string, q2 as integer, q3 as string Если бы было все так просто. Мне надо на Delphi. |
| Автор: comtat 28.6.2006, 07:38 | ||
ДЫМ, у тебя фиксированные строки или произвольные ??
Это и есть часть кода на SQL |
| Автор: ДЫМ 28.6.2006, 22:18 | ||||
| Вопрос решен! Если кому-то интересно, решил написать как, потому что подобную проблему поднимали на форуме и тогда так и не нашли решения. Понятно, что надо использовать StringList.CustomSort, я это подразумевал с самого начала, проблема как раз была в написании функции сравнения TListSortCompare. Логика такая: встречающиеся в строке числа добиваем нулями слева, чтобы они были одной разрядности, буквы и другие символы не трогаем, например: строку: Строка12Строка5 преобразуем в Строка00012Строка00005 (в данном случае разрядность 5, с запасом) потом сравниваем отформатированные строки
Использование
На выходе получаем то что нам надо 1 1/1 1/2 1/10 1а 1а/1 1а/2 1а/10 1аб 1б 2 2а 10 20 110 Строка №1 Строка №1а Строка №1аб Строка №2 Строка №10 Строка №20 Строка №110 Единственное слабое место - если в строках встретятся числа большей разрядности, чем предусмотрено, но всегда можно взять разрядность побольше, скажем не 5, а 10. |