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

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

Сортировка TList


Макака ©   (2016-02-28 18:08:00) 

Есть TList<integer>. TList.Sort сортирует по возрастанию, как сделать наоборот?


DVM   (2016-02-29 18:05:00) [1]


> Макака   (28.02.16 22:48) [8]

Если бинарный поиск реализован грамотно, то он тоже опирается на функцию сравнения. И ему абсолютно фиолетово, в прямом или обратном порядке отсортирован список.


DVM   (2016-02-29 17:39:00) [2]


> Макака   (28.02.16 22:48) [8]
> Юрий Зотов, только что из твоего источника нашёл, спасибо!
>  
> А бинарный поиск в списке отсортированном по убыванию не
> робит?

А какой практический смысл от списка отсортированного в обратном порядке?
К списку же всегда можно обратиться задом-наперед.


Макака   (2016-02-28 22:48:00) [3]

Юрий Зотов, только что из твоего источника нашёл, спасибо!
А бинарный поиск в списке отсортированном по убыванию не робит?


Юрий Зотов   (2016-02-28 22:48:00) [4]

Вот тут все хорошо описано:
http://www.tdelphiblog.com/2009/07/2-generics-delphi-2009-win32-2.html


Юрий Зотов   (2016-02-28 22:43:00) [5]

Эх, давно я с Delphi дела не имел - но похоже, что все проще: сначала List.Sort. затем List.Reverse.


Юрий Зотов   (2016-02-28 22:31:00) [6]

http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TList_%28Delphi%29


Макака   (2016-02-28 22:23:00) [7]

Я сделал так


function ListSort(Item1, Item2: Pointer): Integer;
begin
if integer(item1)>=integer(item2) then result:=0 else result:=1;
end;

Похоже что одно и тоже.
У меня ошибка выходит "не актуальные параметры" в месте
List.Sort(ListSort);
С этого момента я начал шустрить по инету, но так и не понял из-за чего.


Юрий Зотов   (2016-02-28 22:18:00) [8]

Используем тот факт, что Integer и Pointer занимают одинаковый размер памяти. То есть, Pointer можно трактовать как Integer, через приведение типа.
function CompareItemsAsInteger(Item1, Item2: Pointer): Integer;
var
 i1, i2: Integer;
begin
 i1 := Integer(Item1);
 i2 := Integer(Item2);
 if i1 > i2 then
   result := 1
 else
   if i1 < i2 then
     result := -1
   else
     result := 0
end;


Макака   (2016-02-28 19:29:00) [9]

var List:TList<integer>;

function ListSort(Item1, Item2: Pointer): Integer;
begin

end;

begin
List:=TList<integer>.Create;
List.Add(1);
List.Add(4);
List.Add(3);
List.Sort(ListSort);
end;


Макака   (2016-02-28 19:27:00) [10]

DVM, это и ежу понятно. В ТСтрингЛист всё просто было через TCustomSort (как хочешь так и сортируешь) а тут весь инет обрыл, везде в ТЛист объекты хранят не числа, хотя по сути в обоих случаях хранятся указатели на объекты. Короче мне очень сложно пока понять что к чему.


DVM   (2016-02-28 19:00:00) [11]

Функцию сортировки свою сделать


Наверх

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