Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Ускорение доступа к элементам TObjectList: сохраняем несколько сортировок"

Delphi , Базы данных , Сортировка и Фильтр

Ускорение доступа к элементам TObjectList: сохраняем несколько сортировок

В процессе работы с большими данными часто возникает потребность быстрого доступа к определенным элементам списка. Особенно это актуально, когда список нужно просматривать или искать элементы по разным критериям. В данной статье мы рассмотрим, как ускорить доступ к элементам TObjectList в Delphi, сохраняя несколько сортировок.

Проблема

У нас есть список TCoordinate, который мы храним в TObjectList. Для быстрого поиска элементов список должен быть отсортирован. Однако, мы чередуем поиск по координате X и Y, что требует повторной сортировки списка каждый раз. Есть ли встроенный способ сохранить результат сортировки, чтобы не сортировать список снова и снова?

Решение

Одним из решений является создание индексной карты, представляющей собой два разных порядка. Это динамический массив целых чисел.

type
  TListOrder = TArray<Integer>;

Когда мы хотим прочитать элемент с помощью этого порядка, мы делаем это следующим образом:

function GetItem(Index: Integer; const Order: TListOrder): TCoordinate;
begin
  Result := List[Order[Index]];
end;

Ключевой момент здесь в том, что мы никогда не меняем содержимое «List». Мы рассматриваем его как неотсортированный. Вместо этого мы храним порядок отдельно от контейнера, что позволяет нам иметь несколько таких порядков.

Следующий вопрос - как создать порядок. Сначала заполните порядок всеми действительными индексами:

var
  i: Integer;
  Order: TListOrder;
...
SetLength(Order, List.Count);
for i := 0 to List.Count-1 do
  Order[i] := i;

Теперь отсортируйте порядок следующим образом:

TArray.Sort<Integer>(Order, Comparer);

Наконец, что использовать в качестве компаратора. Это волшебное место.

var
  Comparer: IComparer<Integer>;
...
Comparer :=
  function(const Left, Right: Integer): Integer
  var
    LeftItem, RightItem: TCoordinate;
  begin
    LeftItem := GetItem(Left, Order);
    RightItem := GetItem(Right, Order);
    Result := ...; // ваша логика сравнения здесь
  end;

И это все!

Альтернативное решение

Если объекты в вашем списке не меняются, вы можете использовать TList для хранения дополнительной ссылки на объекты вместо динамического массива целых чисел, предложенного Дэвидом Хэффернаном. Это имеет небольшое преимущество в времени доступа.

Заключение

В этой статье мы рассмотрели, как ускорить доступ к элементам TObjectList в Delphi, сохраняя несколько сортировок. Используя индексную карту или альтернативное решение с TList, мы можем существенно ускорить поиск элементов в нашем списке.

Создано по материалам из источника по ссылке.

В статье рассматривается способ ускорить доступ к элементам TObjectList в Delphi, сохраняя несколько сортировок для быстрого поиска по разным критериям без необходимости повторной сортировки списка.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:33:37/0.0055179595947266/1