TStringList.CustomSort 的使用原理? 本帖最后由 zhengyc653 于 2012-10-15 17:00:42 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 listview采取快速排序,快速排序需要比较两项数据大小,但你无法比较两个listitem的大小,对吧?所以你需要一个自定义函数:function NumberSort(list: TStringList; index1, index2: Integer): Integer;其中 index1, index2表示待比较两个项序号,程序员可根据自己需要完善比较函数,用以排序 谢谢你的回复,明白了一点点,测试了一下,已经知道怎么用了。但是还是不明白它是怎么运作的:index1, index2表示待比较两个项序号,比较哪两项呢? 我List里可是有好几十甚至是几百个项.在函数中,我们只做了两件事:1、把两个项分别赋值给value1和value2,然后再做比较。2、返回一个值。但实际上,我的项那么多,也不知道它到底取出哪两项进行比较,而且可以根据这两项的大小决定所有项的顺序?返回值是指明是升序还是降序,但整个函数并没有说明用什么东西来排序。难道这两句: value1 := StrToInt(list.Strings[index1]); value2 := StrToInt(list.Strings[index2]);就可以指明用 List 的字符进行排序?那如果把 value1 := StrToInt(list.Strings[index1]); value2 := StrToInt(list.Strings[index2]);改成 value1 := 1; value2 := 2;呢?它用什么排序??测试结果是程序卡死。我如果在函数中只写一句 Result:=1 ,则程序也卡死。期待继续解释。 你是否了解快速排序算法?不知道就上网查一下。如果是单纯的一组数据排序,其中会有一段类似于if a[i]>a[j] then这样的比较代码。但如果你想比较TList的两个项,像list.items[i]>list.items[j]这样的语句是不合法的对吧?所以你需要一个自定义函数Compare(value1,value2:integer):boolean来代替list.items[value1]>list.items[value2]。每当系统调用你这个自定义函数,若返回true则相当于list.items[value1]>list.items[value2],若返回false则相当于list.items[value1]<list.items[value2]。所以说这个自定义函数并不是说具体比较哪两个项,而是提供一个比较的标准。 你可以阅读一下delPhi帮助,表面上你只写了一个比较函数,实际上你提供了一个比较标准,而系统在背后已利用这个标准帮你排好序了。 【庆祝贴】庆祝接分生娃开宝马变大猩猩,哈哈 高手帮忙!!改写SQL语句,有关Oracle的,急!!! 计算的精度问题! 一个sql语句问题!up有分! 请教高手 在线等待 一个很弱智的问题:怎么清空webbrowser中的原有页面? 完整的屏幕拷贝软件,有用的请留email(可实现局域网内屏幕监视,发送信息,控制鼠标、注销、关机等); Clientdataset的内存泄漏问题 为什么我作的Delphi程序编译后其他机器不能用?排除BDE等问题。 如何传输文件到目标计算机? 发个cxgrid的filterControl控件汉化方法 查询、添加问题
其中 index1, index2表示待比较两个项序号,程序员可根据自己需要完善比较函数,用以排序
index1, index2表示待比较两个项序号,比较哪两项呢? 我List里可是有好几十甚至是几百个项.
在函数中,我们只做了两件事:
1、把两个项分别赋值给value1和value2,然后再做比较。
2、返回一个值。但实际上,我的项那么多,也不知道它到底取出哪两项进行比较,而且可以根据这两项的大小决定所有项的顺序?返回值是指明是升序还是降序,但整个函数并没有说明用什么东西来排序。
难道这两句:
value1 := StrToInt(list.Strings[index1]);
value2 := StrToInt(list.Strings[index2]);
就可以指明用 List 的字符进行排序?那如果把
value1 := StrToInt(list.Strings[index1]);
value2 := StrToInt(list.Strings[index2]);
改成
value1 := 1;
value2 := 2;
呢?它用什么排序??
测试结果是程序卡死。我如果在函数中只写一句 Result:=1 ,则程序也卡死。
期待继续解释。