热力学第二定律,简而言之,当程序员阅读时,它指出“任何对象的集合都不会被排序”
我们开发人员倾向于将对象组织成列表、集合、队列、堆栈……
既然您将使用 for 循环遍历元素 – 为什么不先对元素进行排序。更重要的是,排序列表更容易(阅读:更快)被搜索。
例如,对于 TDeveloper 对象列表,您需要在列表中按姓名、知识或薪水或任何其他属性对开发人员(TDeveloper 的实例)进行排序。
那很无聊!我想要我的列表随机化!
如果需要随机化列表中元素的位置怎么办?有可以使用的“UnSort”方法吗?TStrings(或类似的)中是否有“随机化”方法?不。
想象一副纸牌。是的,你现在看到了。如果您始终知道牌组顶部有哪些牌,那么游戏将会多么有趣。
按排序取消排序
那么如何对列表进行排序呢?好吧,按随机顺序排序。开始:
var
//TMyObject = class(TObject)
objects : TObjectList
begin
objects := TObjectList
try
//"missing" code!
//add instances of TMyObjects to the "objects" list...
//randomize / UNSORT / SHUFFLE positions
objects.Sort(TComparer
function(const L,R : TMyObject) : integer
begin
//returns -1, 0 or 1
result := -1 + Random(3);
end
));
//"missing" code!
//do something with randomized items
finally
objects.Free;
end;
end;
就是这样。通过指定比较器来调用 Sort 方法,该比较器将在元素小于或大于比较元素时随机设置。
这看起来很可爱,但如果你有不同的对象列表,你想要打乱,你可能想要一种更简单的方法来调用“unsort”代码。
TGenericListHelper
这是一个公开类方法的示例通用列表助手类。实际上有 2 种 unsort/shuffle 方法——所以选择你更喜欢的一种
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.035209178924561 seconds