Delphi TStringlist自定义排序


本文整理自网络,侵删。

 TStringlist顾名思义就是字符串列表,一般用来存储字符串,当然也可以用来存储对象类型,是delphi开发中经常使用的一个类,关于它的详细用法可以参看万一老师的博客,下面主要是记录我在使用中碰到的一个问题,一下是一段代码。

program StringlistCmp;


 {$APPTYPE CONSOLE}


 uses
   SysUtils,
   Classes;


 function Cmp(List: TStringList; Index1, Index2: Integer): Integer;
    begin
    if StrToint(List[index1])<StrToint(List[Index2]) then
      result:=-1
    else if StrToint(List[index1])=StrToint(List[Index2]) then
      Result:=0
    else
      Result:=1;
    end;


 var
   alist:TStringList;
 begin
   alist:=TStringlist.Create;
   alist.DelimitedText:='30,10,50';
   alist.Sorted:=True;       
   Writeln(alist.DelimitedText);  
   //利用默认排序方法 效果良好

  alist.DelimitedText:='10,3,9';
   Writeln(alist.DelimitedText);
  // 没效果,怎么不是按照 3,9,10显示

  //使用自定义的排序方法,解决问题
  alist.Sorted:=False;
   alist.CustomSort(Cmp);
   Writeln(alist.DelimitedText);
   readln;
 end.



第一次使用默认排序,显示的效果良好,第二次却不是想要的效果,查看delphi源码

当设置sorted后会执行一下方法



接着会执行一下方法







首次执行时sorted为false,故会执行QuickSort方法,QuickSort方法会调用传入的Compare




当没有传入自定义的比较方法时就会执行




可以看到,是执行ascii比较,即根据ascii码值作比较,这样上例中字符串10就比字符串3小,故不是delphi的TStringlist提供的sorted属性的问题

当把sorted设为false,并传入自定义的Cmp方法时,跟踪代码会发现程序就会执行我们传入的自定义的比较方法,这样就可以根据需求灵活定制自己的比较了。




关于TStringlist的用法还有许多,以后有用到再记录。

相关阅读 >>

Delphi xe datasnap服务器获取客户端ip地址

Delphi tidhttp抓取页面信息

Delphi 关闭android安卓程序

Delphi 设置combobox组合框的高度方法总结

Delphi百度云服务平台获取token

Delphi获取其他进程中listbox和combobox的内容

Delphi 刷新系统桌面图标缓存

Delphi 中的字符串

Delphi 关于汉字换行问题

Delphi 如何判断一个exe文件是否运行

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...