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.Collections
的TList<T>
,因此需要来自Generics.Collections
的TCollectionNotification
。但是在您的代码中TCollectionNotification
是System.Classes
中声明的版本。那是因为,在你写 TCollectionNotification
的时候,System.Classes
是在 Generics.Collections
之后使用的。
解决方案是:
-
更改使用顺序,使
Generics.Collections
出现在System.Classes
之后。无论如何,这都是很好的做法。或者,
完全指定类型:Generics.Collections.TCollectionNotification
。
【讨论】:
您省略了一个错误来源:声明了 System.Classes 而不是在这种情况下发生的 System.Generics.Collections :-) 您帮助我找到了罪魁祸首,谢谢!这种混淆存在一些令人讨厌的错误。我会听从你的建议,总是先声明 System.Classes。 这不是错误的来源。如果您省略Generics.Collections
,那么您会遇到不同的失败。那么你的失败是 TList<T>
没有定义。
在这种情况下。主窗体中有 system.classes
声明,但没有 system.generics.collection
导致编译器错误。 tlist
在另一个单元中声明。添加 system.generics.collection 解决了错误。
好吧,我看不到这些细节。顺便说一句,将FEditors
公开似乎是错误的。代码真的是这样吗?以上是关于delphi TList中如何对一个double或者single类型的数据从小到大排序?的主要内容,如果未能解决你的问题,请参考以下文章
数组属性、TList、TStringList 或 TCollection 等 (Delphi Win32)