Vec*_*tor 4 delphi binary-search generic-collections delphi-xe
我需要在使用自定义比较器的 TObjectList 上实现二分搜索,我相信使用 TCustomComparer。
目标:二分查找返回列表中符合特定属性参数的实例。
例如:
TMyClass=class
public
Index:integer
end;
TMyObjectList=TObjectList<TMyClass>;
begin
...
aMyClass.Index:=1;
aMyObjectList.binarysearch(aMyClass, aMyClassRef)
...
end;
Run Code Online (Sandbox Code Playgroud)
或者简单地:
begin
...
aMyObjectList.binarysearch(1, aMyClassRef)
...
end;
Run Code Online (Sandbox Code Playgroud)
我想循环并获取列表中也具有 Index==1 的 TMyClass 实例。
在 C++ 中,重载“==”运算符可以实现此目标。
新的 Delphi“帮助”相当稀疏且分散,使得东西很难找到,而且我不太熟悉新的 Delphi 泛型的所有细微差别。
那么 - 我如何在 Delphi XE 中使用 Generics.TObjectList 来做到这一点?
(使用德尔福XE)。
TIA
帮助文件确实有点有限。Generics.Defaults
我一般只是阅读和的源代码Generics.Collections
。无论如何,您需要提供一个IComparer<TMyClass>
. 有很多方法可以做到这一点。例如,使用匿名函数:
var
List: TObjectList<TMyClass>;
Target: TMyClass;
Index: Integer;
Comparer: IComparer<TMyClass>;
Comparison: TComparison<TMyClass>;
....
Comparison :=
function(const Left, Right: TMyClass): Integer
begin
//Result := ??;//your comparison rule goes here
end;
Comparer := TComparer<TMyClass>.Construct(Comparison);
List.BinarySearch(Target, Index, Comparer);
Run Code Online (Sandbox Code Playgroud)
如果您不想使用匿名函数,您可以通过Comparison
其他方式实现。例如某个对象的方法,或者类函数,甚至只是一个普通的老式非 OOP 函数。它只需具有与上面相同的签名即可。
与比较函数一样,返回 <0 if Left<Right
、 >0 ifLeft>Right
和 0 if Left=Right
。