Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка TList [D7]


AlexLLL ©   (2009-06-21 22:25:00) 

Есть массив ссылок на "большие" структуры
Не совсем понятно как работатает метод сорт

Вот к примеру есть в списке сруктура: 5 - записей типа int и 3 String
как правильно отсортировать Список Tlist по какому то из полей.


AlexLLL   (2009-06-22 21:02:00) [1]


> Германн ©   (22.06.09 01:00) [10]

"в" это опечатка, хотя да был у подруги


Andy BitOff   (2009-06-22 01:04:00) [2]

Прости, кто на ком стоял? (с) профессор Преображенский


Германн   (2009-06-22 01:00:00) [3]


> сужу в гостях тут Delphi не стоит а вопрос в стоит.

???
:)


AlexLLL   (2009-06-21 23:23:00) [4]


> Юрий Зотов ©   (21.06.09 23:21) [8]

Спасибо большое, я это и имел введу, яб уже давно попробовал, сужу в гостях тут Delphi не стоит а вопрос в стоит.


Юрий Зотов   (2009-06-21 23:21:00) [5]

> AlexLLL   (21.06.09 22:56) [7]

Все так, кроме одного - если сравнивать надо числа, то CompareText тут ни при чем (она же строки сравнивает, а надо числа). Удобно использовать функцию Sign из модуля Math (см. в справке), либо написать свою:

if PMyRecord(Item1)^.D1 > PMyRecord(Item2)^.D1 then
 Result := 1
else
 if PMyRecord(Item1)^.D1 < PMyRecord(Item2)^.D1 then
   Result := -1
 else
     Result := 0;


AlexLLL   (2009-06-21 22:56:00) [6]


> Юрий Зотов ©   (21.06.09 22:47) [5]

Ну как бы просто задать правило для двух и все ?
по типу

CompareText сравнить S1 и S2 и возвращает 0, если они равны. Если S1 больше S2, CompareText возвращает целое число больше 0. Если S1 меньше S2, CompareText возвращает целое меньше 0. CompareText не учитывается и не зависит от текущей локали.

Ну вот конкретно мене нужно сортировать по типу Double, получается просту пишу свою функцию и вожращаю по логике то что возращает CompareText текст и все!?


Юрий Зотов   (2009-06-21 22:52:00) [7]

> AlexLLL   (21.06.09 22:42) [4]

Это называется "обратный вызов" (callback). Мы вызываем одну функцию и передаем ей адрес другой функции, заранее известного типа. И первая функция, когда ей надо, вторую вызывает сама.


Юрий Зотов   (2009-06-21 22:47:00) [8]

> AlexLLL   (21.06.09 22:42) [4]

> параметры когда подставлять в функцию?

Никогда. Надо вызвать метод Sort и передать ему адрес функции сравнения, а все остальное метод Sort сделает сам - и функцию вызовет, и параметры ей передаст.


AlexLLL   (2009-06-21 22:42:00) [9]


> Юрий Зотов ©   (21.06.09 22:38) [3]

О прям как в справке.
Ну вот это как раз и немогу понять, с указателями работаю совсем недавно:

List.Sort(@MyFunc) - а параметры когда подставлять в функцию?


AlexLLL   (2009-06-21 22:38:00) [10]


> Наверное только тебе и известно :)


Ну нет пузырьком и вставкой владею :)
не понятно как sort работает

просто может не нужно постоянно "достававть" из списка
ARecord := List.items[i]
........
if ARecord^.sortfield ....


Юрий Зотов   (2009-06-21 22:38:00) [11]

1. В списке TList не может быть структур, в нем могут быть только указатели на структуры.

2. Надо написать свою функцию сравнения, например:

type
 TMyRecord = record
   S1: string;
   ...
 end;
 PMyRecord = ^TMyRecord;

function MyFunc(Item1, Item2: Pointer): Integer;
begin
 Result := CompareText(PMyRecord(Item1)^.S1, PMyRecord(Item2)^.S1
end;


И потом можно будет сортировать:
List.Sort(@MyFunc);

В справке есть пример.


{RASkov}   (2009-06-21 22:33:00) [12]

> [0] AlexLLL   (21.06.09 22:25)
> как правильно отсортировать

Наверное только тебе и известно :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо