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

标签 delphi sorting

我是一个 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/

相关文章:

Delphi XE3、Indy TCPServer 和 TCPClient。发送和接收 CRLF 控制码

Delphi 中的 Windows API 参数 - 使用或不使用 @ 运算符传递 var 参数?

php - 根据PHP中的值对数组进行排序

delphi 7,安装的组件在安装时隐藏

delphi - TRadioGroup 具有可包装的项目

delphi - 水平或垂直滚动​​ TImage

python - 如何在优先考虑其中一个维度的同时对二维列表进行排序

ruby-on-rails - 从数据行中堆叠带有 id 的列对

javascript - javascript 按字母顺序对数组进行排序

jquery - 对多维数组中的数组与其他数组关联进行排序