如何将TObjectList的二进制搜索改写为适应长尾关键词的搜索算法?

2026-04-10 03:181阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

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

如何将TObjectList的二进制搜索改写为适应长尾关键词的搜索算法?

在TObjectList上实现二进制搜索,使用TCustomComparer,目标是从列表中返回具有特定属性值的实例。例如:

csharpTMyClass=class public Index: integer;end;

function TObjectList.FindByIndex(IndexValue: integer): TMyClass;var I: integer;begin Result :=nil; for I :=0 to Count - 1 do begin if Objects[I].Index=IndexValue then begin Result :=TMyClass(Objects[I]); Break; end; end;end;

我需要在使用自定义比较器的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泛型的所有细微差别.

那么 – 我如何使用Generics.TObjectList在Delphi XE中执行此操作?

(使用Delphi XE).

如何将TObjectList的二进制搜索改写为适应长尾关键词的搜索算法?

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

如果您不想使用匿名函数,可以通过其他方式实现比较.例如,某个对象或类函数的方法,或者甚至只是普通的老式非OOP函数.它必须具有与上面相同的签名.

与比较函数一样,如果Left< Right,则返回< 0;如果Left>则返回0;如果Left = Right,则返回0.

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

如何将TObjectList的二进制搜索改写为适应长尾关键词的搜索算法?

在TObjectList上实现二进制搜索,使用TCustomComparer,目标是从列表中返回具有特定属性值的实例。例如:

csharpTMyClass=class public Index: integer;end;

function TObjectList.FindByIndex(IndexValue: integer): TMyClass;var I: integer;begin Result :=nil; for I :=0 to Count - 1 do begin if Objects[I].Index=IndexValue then begin Result :=TMyClass(Objects[I]); Break; end; end;end;

我需要在使用自定义比较器的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泛型的所有细微差别.

那么 – 我如何使用Generics.TObjectList在Delphi XE中执行此操作?

(使用Delphi XE).

如何将TObjectList的二进制搜索改写为适应长尾关键词的搜索算法?

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

如果您不想使用匿名函数,可以通过其他方式实现比较.例如,某个对象或类函数的方法,或者甚至只是普通的老式非OOP函数.它必须具有与上面相同的签名.

与比较函数一样,如果Left< Right,则返回< 0;如果Left>则返回0;如果Left = Right,则返回0.