Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1211977078
TForumHelp
2008-05-28 16:17
2009.08.23
Создание компонента


15-1245961803
Юрий
2009-06-26 00:30
2009.08.23
С днем рождения ! 26 июня 2009 пятница


2-1245989782
novai
2009-06-26 08:16
2009.08.23
Директивы компилятора в релизе программы


15-1245441971
Andy BitOff
2009-06-20 00:06
2009.08.23
119 никому ненужных фактов, хотя....


15-1245529804
Юрий
2009-06-21 00:30
2009.08.23
С днем рождения ! 21 июня 2009 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский