Delphi问题:如何对Tobjectlist<>进行排序

9

我想使用内置的sort方法对我的通用对象列表进行排序。

以下是我的做法:

//create the list object
myList := TObjectList<MyType>.Create(false);   

[...] //populate the list with unsorted entries

//sort the list
myList.sort(@Comparer);

[...]//store sorted results back to array

myList.Destroy;

我的比较器函数如下:

function Comparer(Item1, Item2 : pointer):integer;
begin
  result := myCompare(item1, item2);
end;

根据规格,它应该像这样工作。

我收到一个编译器错误E2250 不存在这些参数的'排序(Sort)'的重载版本(确切的措辞有所不同,我使用RAD Studio的非英语版本)

我不知道为什么这不是有效的Pascal代码 - 你们中有没有人能分享一下见解?


虽然Leonardo和我提供了更多的细节,但Rob的答案对你来说最有用。编译器通常会清楚地说明为什么反对某些东西。 - David Heffernan
3个回答

9

你已经接近成功了。由于我不知道MyType是什么,你可能需要更改对myCompare函数的调用。

myList.Sort(TComparer<MyType>.Construct(
   function (const L, R: MyType): integer
   begin
     result := myCompare(L, R);
   end
));

+1 Leonardo。看到另一个智利的Delphi程序员在这里,感觉很好,我以为我是唯一的 ;)。 - RRUZ
我实际上是指StackOverflow,但关于Delphi,你说得对,似乎我们是一种濒临灭绝的物种。 - RRUZ
非常感谢,它终于可以工作了(我在使用子句中缺少了单位generics.defaults)。 - sum1stolemyname
在这种情况下,你不可以简单地调用 myList.Sort(TComparer<MyType>.Construct(myCompare)); 吗? - alondono
@alondono 可能是这样,但这就是 OP 实现“Comparer”的方式。 - Leonardo Herrera

6

TObjectList<T>.Sort声明如下:

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

IComparer<T>被定义为:

IComparer<T> = interface
  function Compare(const Left, Right: T): Integer;
end;

您正在实例化 TObjectList<MyType>,因此需要传递一个 IComparer<MyType>Sort。为了做到这一点,您需要一个对象来提供该接口的具体实现。
一个明显的方法是子类化 TObjectList<MyType> 并在那里实现接口。
另一种方法是使用 TComparer<T> 来创建一个按需的 IComparer<T>,使用它的 Construct 类函数。您需要提供一个比较函数:
TComparison<T> = reference to function(const Left, Right: T): Integer;

Leonardo的回答展示了如何完成这个操作。


4
如果编译器说没有使用该参数类型的重载版本,请问自己有哪些重载版本存在。检查源代码或文档以找出答案。
在那里,您会看到>从>继承了两个方法。一个不带参数,另一个带有对实现IComparer >接口的引用。 您的独立函数不符合该要求。编写 TComparer >的后代并覆盖其方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接