![]() |
|
Модераторы: Poseidon |
![]()
|
|
| ДЫМ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
У меня есть список строк (если кому интересно, номера домов)
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а Как мне поступить? Подскажите, очень надо. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 2 Всего: 50 |
ДЫМ,
Используй метод TStringList.CustomSort -------------------- |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 5 Всего: 133 |
Использован алгоритм Вита
Код написан безобразно, т.к. уже 3 часа ночи -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| ДЫМ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
Poseidon, за ночную работу держи "плюсик", для моей задачи худо-бедно сгодится. Но вот не дает мне покоя Total Commander, как сортирует хорошо зараза, но как это делает - не понятно.
Ну скажите, как получить такой же порядок строк: Строка №1 Строка №1а Строка №1аб Строка №2 Строка №10 Строка №20 Строка №110 или 1/1 1/2 1/10 Раз смогли авторы Total Commander`а, то ведь можно разгадать это? Или нет? |
|||
|
||||
| comtat |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1310 Регистрация: 2.5.2006 Где: Россия, Казань Репутация: 8 Всего: 71 |
ДЫМ,
берешь строку выкидываешь из нее например "Строка №" и делаешь как в предыдушем примере А потом при
Вот и все.... -------------------- Рожденный в СССР !!! ExtJS - мой фреймворк |
|||
|
||||
| ДЫМ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
Пример Poseidon не работает для набора
1/1 1/2 1/10 да и вообще нужно что-то универсальное, а оно есть... |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 17 Всего: 454 |
Следует разделить строку на кванты и сортировать уже их.
Скажем строка Строка №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 |
|
|||
![]() странник Интернета ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 27.2.2006 Где: Русь Репутация: 2 Всего: 10 |
Я вот думаю, что можно для сортировки использовать таблицу ASCII. ПОка не знаю как, но может додумаюсь, так код выложу.
Примерные набросок, смотрим число, после него встречаем букву и сравниваем ASCII код последующих букв. -------------------- Делай добро и бросай его в воду... оно не утонет.. добром к тебе вернеться. http://picasaweb.google.com/LesnoyChelovek/Photo |
|||
|
||||
| ДЫМ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
Akina , но как же определить где кончается один квант и начинается другой? Выходит что надо разделить строку на цепочки букв и цифр, последние надо рассматривать как числа и соответственно сортировать как числа, так что ли?
А это что за строка? Напоминает SQL order by q1 as string, q2 as integer, q3 as string Если бы было все так просто. Мне надо на Delphi. |
|||
|
||||
| comtat |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1310 Регистрация: 2.5.2006 Где: Россия, Казань Репутация: 8 Всего: 71 |
ДЫМ, у тебя фиксированные строки или произвольные ??
Это и есть часть кода на SQL -------------------- Рожденный в СССР !!! ExtJS - мой фреймворк |
|||
|
||||
| ДЫМ |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 6.1.2004 Репутация: нет Всего: 8 |
Вопрос решен!
Если кому-то интересно, решил написать как, потому что подобную проблему поднимали на форуме и тогда так и не нашли решения. Понятно, что надо использовать 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. Это сообщение отредактировал(а) ДЫМ - 28.6.2006, 22:20 |
||||
|
|||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |