【问题标题】:Implementing Custom Binary Search for TObjectList<myClass> (Delphi XE)为 TObjectList<myClass> 实现自定义二进制搜索(Delphi XE)
【发布时间】:2012-09-05 18:04:50
【问题描述】:

我需要在使用自定义比较器的 TObjectList 上实现二进制搜索,我相信使用 TCustomComparer。

目标:二分查找返回列表中符合特定属性参数的实例。

例如:

TMyClass=class
    public
     Index:integer
end;

TMyObjectList=TObjectList<TMyClass>;

begin
  ...
    aMyClass.Index:=1;
    aMyObjectList.binarysearch(aMyClass, aMyClassRef) 
  ...
end;

或者简单地说:

 begin
   ...
     aMyObjectList.binarysearch(1, aMyClassRef) 
   ...
 end;

我想循环并取回列表中也有 Index==1 的 TMyClass 实例。

在 C++ 中,重载“==”运算符可以实现这一目标。

新的 Delphi '帮助'相当稀少,分散在周围,很难找到,而且我对新的 Delphi 泛型的所有细微差别都不是很熟悉。

那么 - 我如何在 Delphi XE 中使用 Generics.TObjectList 做到这一点?

(使用 Delphi XE)。

TIA

【问题讨论】:

    标签: delphi delphi-xe binary-search generic-collections


    【解决方案1】:

    这里的帮助文件确实有点局限。我一般只是将源代码阅读到Generics.DefaultsGenerics.Collections。无论如何,您需要提供IComparer&lt;TMyClass&gt;。有很多方法可以做到这一点。例如,使用匿名函数:

    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);
    

    如果您不想使用匿名函数,您可以通过其他方式实现Comparison。例如某个对象的方法,或类函数,甚至只是一个普通的老式非 OOP 函数。它只需要具有与上述相同的签名即可。

    与比较函数一样,如果Left&lt;Right返回Left>Right返回>0,如果Left=Right返回0。

    【讨论】:

    • 谢谢大卫 - 当我问自己你回答的问题时,你的编辑突然出现了。
    • 很高兴看到你还在努力工作,大卫。我个人有一份工作,除非必要,否则不会在这里花太多时间。希望我能贡献更多。我确实阅读了大量的源代码,但我已经迟到了这个项目,我知道我会马上在这里得到答案。再次感谢。米
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多