Delphi中TObjectList如何实现类似BinarySearch的复杂度优化算法?

2026-04-10 20:422阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计601个文字,预计阅读时间需要3分钟。

Delphi中TObjectList如何实现类似BinarySearch的复杂度优化算法?

如果我们在在线查找`TObjectList`的`binarysearch`方法时遇到了问题,我们会发现`tobjectList`可以访问这个方法。但当我们尝试在XE3中编译时,会遇到编译错误。对于这个示例,`sort`函数也是可用的,但编译过程存在问题。

如果我们查看XE2或XE3 for TObjectList methods的在线帮助
,我们看到了tobjectList可以访问binarysearch函数.但是如果我们尝试进入XE3,它甚至都不会编译.

对于该示例,sort函数也可用,但是这个编译.

欢迎任何想法.

示例代码:

unit FM_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Contnrs, Vcl.CheckLst, System.Generics.Collections; type TTPRODData = class private FData1 : String; FData2 : String; FCount : Integer; public constructor Create; overload; destructor Destroy; override; end; TTPRODDataList = class(TObjectList) function GetItem(Index: Integer): TTPRODData; procedure SetItem(Index: Integer; const Value: TTPRODData); public constructor Create; overload; destructor Destroy; override; property Items[Index: Integer]: TTPRODData read GetItem write SetItem; default; procedure SortOnProductCode; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} // // Sort function. // function CompareProductCode(Item1, Item2: Pointer): Integer; begin Result := CompareStr(TTPRODData(Item1).FData1, TTPRODData(Item2).FData1); end; // // // procedure TForm1.Button1Click(Sender: TObject); var aProdList : TTPRODDataList; aDummy : TTPRODData; aNdx : Integer; begin aProdList := TTPRODDataList.Create; // This call works. aProdList.Sort(CompareProductCode); // This call doesn't even compile ! aProdList.BinarySearch(aDummy, aNdx); end; { TTPRODData } constructor TTPRODData.Create; begin inherited Create; FData1 := ''; FData2 := ''; FCount := 0; end; destructor TTPRODData.Destroy; begin inherited; end; { TTPRODDataList } constructor TTPRODDataList.Create; begin inherited Create; end; destructor TTPRODDataList.Destroy; begin Clear; inherited; end; function TTPRODDataList.GetItem(Index: Integer): TTPRODData; begin result := TTPRODData(inherited GetItem(index)); end; procedure TTPRODDataList.SetItem(Index: Integer; const Value: TTPRODData); begin inherited setItem(index, value); end; procedure TTPRODDataList.SortOnProductCode; begin Sort(CompareProductCode); end; end.

正如David Heffernan所建议的那样,请遵循sort函数的比较器代码.

对于那些感兴趣的人,请遵循比较器方法的代码:

Delphi中TObjectList如何实现类似BinarySearch的复杂度优化算法?

TTProdComparer = class(TComparer<TTPRODData>) public function Compare(const Item1, Item2: TTPRODData): Integer; override; end; And the code : { TTProdComparer } function TTProdComparer.Compare(const Item1, Item2: TTPRODData): Integer; begin Result := CompareStr(Item1.FData1 , Item2.FData1 ); end; 您链接到的文档是针对通用容器TObjectList< T>来自Generics.Collections单元.

但是,您在代码中使用的类是Contnrs单元中的遗留非泛型容器TObjectList.

您尝试使用的BinarySearch方法仅存在于泛型类中.

如果切换到通用容器,那么您会发现可以从类中删除大部分样板代码.它成为了:

TTPRODDataList = class(TObjectList<TTPRODData>) public procedure SortOnProductCode; end;

您不需要GetItem,SetItem和Items,因为类型安全的泛型类已经对该功能进行了排序.

您需要做的唯一工作是调整您的排序代码以适应Delphi通用容器使用的稍微不同的界面.

本文共计601个文字,预计阅读时间需要3分钟。

Delphi中TObjectList如何实现类似BinarySearch的复杂度优化算法?

如果我们在在线查找`TObjectList`的`binarysearch`方法时遇到了问题,我们会发现`tobjectList`可以访问这个方法。但当我们尝试在XE3中编译时,会遇到编译错误。对于这个示例,`sort`函数也是可用的,但编译过程存在问题。

如果我们查看XE2或XE3 for TObjectList methods的在线帮助
,我们看到了tobjectList可以访问binarysearch函数.但是如果我们尝试进入XE3,它甚至都不会编译.

对于该示例,sort函数也可用,但是这个编译.

欢迎任何想法.

示例代码:

unit FM_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Contnrs, Vcl.CheckLst, System.Generics.Collections; type TTPRODData = class private FData1 : String; FData2 : String; FCount : Integer; public constructor Create; overload; destructor Destroy; override; end; TTPRODDataList = class(TObjectList) function GetItem(Index: Integer): TTPRODData; procedure SetItem(Index: Integer; const Value: TTPRODData); public constructor Create; overload; destructor Destroy; override; property Items[Index: Integer]: TTPRODData read GetItem write SetItem; default; procedure SortOnProductCode; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} // // Sort function. // function CompareProductCode(Item1, Item2: Pointer): Integer; begin Result := CompareStr(TTPRODData(Item1).FData1, TTPRODData(Item2).FData1); end; // // // procedure TForm1.Button1Click(Sender: TObject); var aProdList : TTPRODDataList; aDummy : TTPRODData; aNdx : Integer; begin aProdList := TTPRODDataList.Create; // This call works. aProdList.Sort(CompareProductCode); // This call doesn't even compile ! aProdList.BinarySearch(aDummy, aNdx); end; { TTPRODData } constructor TTPRODData.Create; begin inherited Create; FData1 := ''; FData2 := ''; FCount := 0; end; destructor TTPRODData.Destroy; begin inherited; end; { TTPRODDataList } constructor TTPRODDataList.Create; begin inherited Create; end; destructor TTPRODDataList.Destroy; begin Clear; inherited; end; function TTPRODDataList.GetItem(Index: Integer): TTPRODData; begin result := TTPRODData(inherited GetItem(index)); end; procedure TTPRODDataList.SetItem(Index: Integer; const Value: TTPRODData); begin inherited setItem(index, value); end; procedure TTPRODDataList.SortOnProductCode; begin Sort(CompareProductCode); end; end.

正如David Heffernan所建议的那样,请遵循sort函数的比较器代码.

对于那些感兴趣的人,请遵循比较器方法的代码:

Delphi中TObjectList如何实现类似BinarySearch的复杂度优化算法?

TTProdComparer = class(TComparer<TTPRODData>) public function Compare(const Item1, Item2: TTPRODData): Integer; override; end; And the code : { TTProdComparer } function TTProdComparer.Compare(const Item1, Item2: TTPRODData): Integer; begin Result := CompareStr(Item1.FData1 , Item2.FData1 ); end; 您链接到的文档是针对通用容器TObjectList< T>来自Generics.Collections单元.

但是,您在代码中使用的类是Contnrs单元中的遗留非泛型容器TObjectList.

您尝试使用的BinarySearch方法仅存在于泛型类中.

如果切换到通用容器,那么您会发现可以从类中删除大部分样板代码.它成为了:

TTPRODDataList = class(TObjectList<TTPRODData>) public procedure SortOnProductCode; end;

您不需要GetItem,SetItem和Items,因为类型安全的泛型类已经对该功能进行了排序.

您需要做的唯一工作是调整您的排序代码以适应Delphi通用容器使用的稍微不同的界面.