| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Сортировка строк. сложный случай |
| Автор: Pcrepair 27.7.2012, 07:12 |
| Добрый день. Есть четыре компонента: 1. Строка, содержит текстовый файл(точнее текстовая часть ХТМЛ-страницы) 2. Строка, содержит несколько слов (слова поиска) 3. Рейтинг(число), результат работы функции function Index(const S1,S2:string; A:integer):integer; 4. Строка - URL из которого получена ХТМЛ-страница По ходу работы программы получается пара "рейтинг - УРЛ", текстовый файл и слова поиска УЖЕ не важны необходимо эти пары (сотни а то и тысячи строк) отсортировать по возрастанию(или убыванию), по значению Рейтинг(число), причем после сортировки Рейтинг тоже уже не нужен. в конечном варианте нужны только строки УРЛ, отсортированные по Рейтингу Вопрос: какими способами можно все это сделать? первое что приходит на ум это TStringList, там есть пары, но сам пока еще пробовал. возможно кто то что то знает, уже? |
| Автор: DarkProg 27.7.2012, 11:20 |
| Если в лоб, то просто пишете свой record где описываете все необходимые вам поля. Потом делаете массив этих записей. Потом пишите любую сортировку(на ваш вкус), только при сортировке в качестве критерия выбираете конкретное поле. |
| Автор: БелАмор 27.7.2012, 22:39 |
Вариантов - вагон и маленькая тележка... Не согласен. Я считаю, что следует по максимуму использовать то, что уже имеется. В VCL сортировку умеют делать, в частности, TList, TObjectList, TStringList. Использовать TStringList можно, причём в нескольких вариантах, но, на мой взгляд, в данном случае это неоптимально. Быстрее всего ваши данные уже лежат в каком-то хранилище. Бысрее всего это динамический массив структур (записей). В этом случае можно создать TList и заполнить его указателями на эти структуры. При этом следует иметь в виду, что до окончания работы с указателями массив не должен пересраспределяться, в частности не должен меняться его размер. Далее пишется функция (не метод) сравнения двух структур (одна строчка) и вызывается метод Sort. Всё. в TList находится отсортированный список указателей на ваши структуры. |
| Автор: Pcrepair 28.7.2012, 13:31 | ||
вот что получилось в результате, правда пришлось ввести ГлобПерем в качестве буфера. некоторые считают что так неправильно. сразу встречный вопрос - как правильно?
|
| Автор: DarkProg 28.7.2012, 16:15 | ||
Правильно, отправить в описание класса формы, в зависимости от необходимой видимости объекта для других классов и наследников в секцию private или public.
А разрушать и создавать, удобно в событиях OnCreate и OnDestroy у формы. Главное чтобы внутри нигде не сделали создание объекта повторно. |
| Автор: БелАмор 28.7.2012, 22:27 | ||
Код, мягко говоря, очень далёк от идеального. Если подробно объяснять все недочёты, можно написать целую книгу. Вместо этого я приведу более корректный вариант того, что вы хотели реализовать. Будут вопросы - спрашивайте.
Хотел бы только ещё добавить, что идея хранить рабочие данные в StringList крайне неудачна по нескольким причинам: 1. В реальности у вас данных больше, чем одна строка и одно число. 2. Нестандартное использование указателя для хранения целого числа. Без крайней необходимости такое делать не стоит. Крайней необходимости в данном случае не наблюдается. Все средства следует стараться использовать максимально штатным образом. При нестандартном использовании чего-либо всегда есть вероятность нарваться на неожиданную проблему. Например, на такую: http://delphikingdom.com/asp/viewitem.asp?catalogid=1035 |