Форум: "Начинающим";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
ВнизСортировка TList Найти похожие ветки
← →
AlexLLL (2009-06-21 22:25) [0]Есть массив ссылок на "большие" структуры
Не совсем понятно как работатает метод сорт
Вот к примеру есть в списке сруктура: 5 - записей типа int и 3 String
как правильно отсортировать Список Tlist по какому то из полей.
← →
{RASkov} © (2009-06-21 22:33) [1]> [0] AlexLLL (21.06.09 22:25)
> как правильно отсортировать
Наверное только тебе и известно :)
← →
AlexLLL (2009-06-21 22:38) [2]
> Наверное только тебе и известно :)
Ну нет пузырьком и вставкой владею :)
не понятно как sort работает
просто может не нужно постоянно "достававть" из списка
ARecord := List.items[i]
........
if ARecord^.sortfield ....
← →
Юрий Зотов © (2009-06-21 22:38) [3]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);
В справке есть пример.
← →
AlexLLL (2009-06-21 22:42) [4]
> Юрий Зотов © (21.06.09 22:38) [3]
О прям как в справке.
Ну вот это как раз и немогу понять, с указателями работаю совсем недавно:
List.Sort(@MyFunc) - а параметры когда подставлять в функцию?
← →
Юрий Зотов © (2009-06-21 22:47) [5]> AlexLLL (21.06.09 22:42) [4]
> параметры когда подставлять в функцию?
Никогда. Надо вызвать метод Sort и передать ему адрес функции сравнения, а все остальное метод Sort сделает сам - и функцию вызовет, и параметры ей передаст.
← →
Юрий Зотов © (2009-06-21 22:52) [6]> AlexLLL (21.06.09 22:42) [4]
Это называется "обратный вызов" (callback). Мы вызываем одну функцию и передаем ей адрес другой функции, заранее известного типа. И первая функция, когда ей надо, вторую вызывает сама.
← →
AlexLLL (2009-06-21 22:56) [7]
> Юрий Зотов © (21.06.09 22:47) [5]
Ну как бы просто задать правило для двух и все ?
по типу
CompareText сравнить S1 и S2 и возвращает 0, если они равны. Если S1 больше S2, CompareText возвращает целое число больше 0. Если S1 меньше S2, CompareText возвращает целое меньше 0. CompareText не учитывается и не зависит от текущей локали.
Ну вот конкретно мене нужно сортировать по типу Double, получается просту пишу свою функцию и вожращаю по логике то что возращает CompareText текст и все!?
← →
Юрий Зотов © (2009-06-21 23:21) [8]> 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 23:23) [9]
> Юрий Зотов © (21.06.09 23:21) [8]
Спасибо большое, я это и имел введу, яб уже давно попробовал, сужу в гостях тут Delphi не стоит а вопрос в стоит.
← →
Германн © (2009-06-22 01:00) [10]
> сужу в гостях тут Delphi не стоит а вопрос в стоит.
???
:)
← →
Andy BitOff © (2009-06-22 01:04) [11]Прости, кто на ком стоял? (с) профессор Преображенский
← →
AlexLLL (2009-06-22 21:02) [12]
> Германн © (22.06.09 01:00) [10]
"в" это опечатка, хотя да был у подруги
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c