delphi TList中如何对一个double或者single类型的数据从小到大排序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi TList中如何对一个double或者single类型的数据从小到大排序?相关的知识,希望对你有一定的参考价值。

如下 想要对MissRate进行小到大或者大到小排序 double类型
少了个对比函数 如何进行对比?
type
P_MissInfo = ^MissInfo;
MissInfo = record
Missqty: integer;
MissRate:Double;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
list: Tlist;
PMissInfo: P_MissInfo;
begin
list := Tlist.create;

New(PMissInfo);
PMissInfo.Missqty:= 10;
PMissInfo.MissRate:= 12.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 5;
PMissInfo.MissRate:= 5.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 2;
PMissInfo.MissRate:= 1.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 50;
PMissInfo.MissRate:= 25.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 2;
PMissInfo.MissRate:= 2.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 12;
PMissInfo.MissRate:= 12.8;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 9;
PMissInfo.MissRate:= 28.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 9;
PMissInfo.MissRate:= 11.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 9;
PMissInfo.MissRate:= 11.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 9;
PMissInfo.MissRate:= 1.56;
list.Add(PMissInfo);

New(PMissInfo);
PMissInfo.Missqty:= 9;
PMissInfo.MissRate:= 45.56;
list.Add(PMissInfo);

list.Sort(@排序函数);
Showmessage(IntToStr(list.Count));
showmessage(FloatToStr(P_MissInfo(list.Items[0]).MissRate));
end.

比较大小的回调函数(即你称为“排序函数”的)如下:
function CompareMissInfo( P, Q : Pointer ) : Integer;
begin
Result := 0;
if P = Q then
Exit;
// 根据MissRate由小到大排序,如果是由大到小,则把Result:=-1和Result:=1调换一下。
if P_MissInfo(P)^.MissRate < P_MissInfo(Q)^.MissRate then
Result := -1
else if P_MissInfo(P)^.MissRate > P_MissInfo(Q)^.MissRate then
Result := 1;
end;
参考技术A 给一个思路了:
list的成员
Pmember 给几个属性:Idx索引,val1:variant,val2:variant....

Mylist.sortlist(sortbyvarname:string):Tlist ;
该属性 返回一个新的List 将原来的 list 按照 某个参数的值进行排序,
排序后的 成员逐个添加到新的list中,作为返回。

排序的计算可以根据
for i := 0 to MYoriginalList.Count - 1 do
begin
temp := MYoriginalList.member[i].val1;
idx:=i;
for j:=0 to MYoriginalList.Count - 1 do
begin
if (temp<MYoriginalList.member[j].val1) and
(MYoriginalList.member[j].idx 不存在于MYnewlist.list中)
then
begin
temp :=MYoriginalList.member[j].val1 ;
idx:=j;
end;
end;
MYnewlist.add(member[idx])
end;

===

只是个思路,具体,还需要自己再仔细想想了。
参考技术B 纠结

如何使用通用 TList 的 OnNotify

【中文标题】如何使用通用 TList 的 OnNotify【英文标题】:How to use OnNotify of generic TList 【发布时间】:2013-11-07 20:14:15 【问题描述】:

我想使用通用 TList 的 OnNotify 事件。将过程分配给 OnNotify 会产生错误消息:

E2010 Incompatible types: 'System.Generics.Collections.TCollectionNotification' and 'System.Classes.TCollectionNotification'

我正在声明一个类,其中使用了一个通用的 TList,如下所示:

TEditor_Table = class (TObject)
public
  FEditors: TList<TGradient_Editor>;  // List containing the editors

这不是最好的方法,但我需要这个来进行测试。该列表在构造函数中被实例化:

constructor TEditor_Table.Create (Owner: TFMXObject);
begin
   inherited Create;

   FEditors := TList<TGradient_Editor>.Create;
   FOwner := Owner;
end; // Create //

接下来在主窗体中声明一个函数

procedure do_editor_change (Sender: TObject; const Item: TGradient_Editor; Action: TCollectionNotification);

TColor_Editor 类实例化如下:

FColor_Editor := TEditor_Table.Create (List_Gradients);
FColor_Editor.FEditors.OnNotify := do_editor_change;
                                                   ^
error occurs here----------------------------------+

我根本不理解该消息,我不明白为什么编译器似乎混淆了这两个单元:“System.Generics.Collections.TCollectionNotification”和“System.Classes.TCollectionNotification”。我做错了什么?

【问题讨论】:

【参考方案1】:

问题在于 RTL 定义了两个不同版本的TCollectionNotification。一个在System.Classes,一个在Generics.Collections

您正在使用来自Generics.CollectionsTList&lt;T&gt;,因此需要来自Generics.CollectionsTCollectionNotification。但是在您的代码中TCollectionNotificationSystem.Classes 中声明的版本。那是因为,在你写 TCollectionNotification 的时候,System.Classes 是在 Generics.Collections 之后使用的。

解决方案是:

    更改使用顺序,使Generics.Collections 出现在System.Classes 之后。无论如何,这都是很好的做法。或者, 完全指定类型:Generics.Collections.TCollectionNotification

【讨论】:

您省略了一个错误来源:声明了 System.Classes 而不是在这种情况下发生的 System.Generics.Collections :-) 您帮助我找到了罪魁祸首,谢谢!这种混淆存在一些令人讨厌的错误。我会听从你的建议,总是先声明 System.Classes。 这不是错误的来源。如果您省略Generics.Collections,那么您会遇到不同的失败。那么你的失败是 TList&lt;T&gt; 没有定义。 在这种情况下。主窗体中有 system.classes 声明,但没有 system.generics.collection 导致编译器错误。 tlist 在另一个单元中声明。添加 system.generics.collection 解决了错误。 好吧,我看不到这些细节。顺便说一句,将FEditors 公开似乎是错误的。代码真的是这样吗?

以上是关于delphi TList中如何对一个double或者single类型的数据从小到大排序?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi,如何在 TList 中释放记录

数组属性、TList、TStringList 或 TCollection 等 (Delphi Win32)

delphi 线程教学第六节:TList与泛型

如何使用 TMyRecord 中的通用子列表释放通用 TList<TMyRecord>

delphi 面向对象实用技能教学一(递归)

delphi中如何判断是否数字?