В данной статье мы рассмотрим реализацию бинарного поиска в TObjectList с пользовательским компаратором в Delphi XE.
Цель: бинарный поиск должен возвращать экземпляры в списке, которые соответствуют определенному параметру свойства.
Например, у нас есть класс TMyClass с полем Index типа integer:
TMyClass = class
public
Index: Integer;
end;
Используя TObjectList, мы хотим выполнить бинарный поиск по значению поля Index:
var
aMyClass: TMyClass;
aMyClassRef: TMyClass;
aMyObjectList: TObjectList<TMyClass>;
begin
...
aMyClass.Index := 1;
aMyObjectList.BinarySearch(aMyClass, aMyClassRef);
...
end;
Или, еще проще, выполнить поиск по значению поля Index напрямую:
begin
...
aMyObjectList.BinarySearch(1, aMyClassRef);
...
end;
Мы хотим пройтись по списку и получить экземпляры TMyClass, у которых также Index == 1. В C++ перегрузка оператора '==' позволяет достичь этой цели. Но как это сделать в Delphi XE с TObjectList?
Для реализации бинарного поиска с пользовательским компаратором в Delphi XE нам нужно предоставить IComparer. Есть несколько способов это сделать, например, используя анонимную функцию:
var
List: TObjectList<TMyClass>;
Target: TMyClass;
Index: Integer;
Comparer: IComparer<TMyClass>;
Comparison: TComparison<TMyClass>;
begin
...
Comparison :=
function(const Left, Right: TMyClass): Integer
begin
Result := ??; // ваше правило сравнения здесь
end;
Comparer := TComparer<TMyClass>.Construct(Comparison);
List.BinarySearch(Target, Index, Comparer);
end;
Если вы не хотите использовать анонимную функцию, вы можете реализовать "Comparison" другим способом, например, в виде метода объекта, статической функции класса или даже обычной функции без ООП. Главное, чтобы сигнатура была такой же, как и у вышеприведенной функции.
При реализации функций сравнения возвращайте <0, если Left < Right, >0, если Left > Right, и 0, если Left = Right.
Надеемся, эта статья помогла вам разобраться с реализацией бинарного поиска в TObjectList с пользовательским компаратором в Delphi XE. Удачи в ваших проектах!
В данной статье рассматривается реализация бинарного поиска в TObjectList с пользовательским компаратором в Delphi XE.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.