gpt4 book ai didi

delphi - 如何使用自定义比较器对通用列表进行排序?

转载 作者:行者123 更新时间:2023-12-03 14:32:53 25 4
gpt4 key购买 nike

我是一个 Delphi 新手,我不明白如何调用 TList of Records 的 Sort 方法以便按升序整数值对记录进行排序。我有如下记录:

 type
TMyRecord = record
str1: string;
str2: string;
intVal: integer;
end;

以及此类记录的通用列表:

TListMyRecord = TList<TMyRecord>;

尝试在帮助文件中查找代码示例,并找到了这个:

MyList.Sort(@CompareNames);

我不能使用它,因为它使用类。所以我尝试编写自己的比较函数,参数略有不同:

function CompareIntVal(i1, i2: TMyRecord): Integer;
begin
Result := i1.intVal - i2.intVal;
end;

但是当我使用 open.Sort(CompareIntVal); 调用它时,编译器总是抛出“参数不足”错误,这似乎很明显;所以我试着更接近帮助文件:

function SortKB(Item1, Item2: Pointer): Integer;
begin
Result:=PMyRecord(Item1)^.intVal - PMyRecord(Item2)^.intVal;
end;

PMyRecord 为 PMyRecord = ^TMyRecord;

我尝试了不同的方法来调用函数,总是遇到一些错误......

最佳答案

Sort您应该使用的重载是这个:

procedure Sort(const AComparer: IComparer<TMyRecord>);

现在,您可以创建 IComparer<TMyRecord>通过调用 TComparer<TMyRecord>.Construct 。像这样:

var
Comparison: TComparison<TMyRecord>;
....
Comparison :=
function(const Left, Right: TMyRecord): Integer
begin
Result := Left.intVal-Right.intVal;
end;
List.Sort(TComparer<TMyRecord>.Construct(Comparison));

我已经写了Comparison函数作为匿名方法,但您也可以使用普通的旧式非 OOP 函数或对象的方法。

比较函数的一个潜在问题是您可能会遇到整数溢出问题。因此您可以使用默认的整数比较器。

Comparison := 
function(const Left, Right: TMyRecord): Integer
begin
Result := TComparer<Integer>.Default.Compare(Left.intVal, Right.intVal);
end;

调用TComparer<Integer>.Default可能会很贵重复,以便您可以将其存储在全局变量中:

var
IntegerComparer: IComparer<Integer>;
....
initialization
IntegerComparer := TComparer<Integer>.Default;

要考虑的另一个选项是在创建列表时传入比较器。如果您只使用此顺序对列表进行排序,那么会更方便。

List := TList<TMyRecord>.Create(TComparer<TMyRecord>.Construct(Comparison));

然后您可以使用以下命令对列表进行排序

List.Sort;

关于delphi - 如何使用自定义比较器对通用列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com