delphi 如何随机化/混洗(通用)集合和列表  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 如何随机化/混洗(通用)集合和列表


热力学第二定律,简而言之,当程序员阅读时,它指出“任何对象的集合都不会被排序” 


我们开发人员倾向于将对象组织成列表、集合、队列、堆栈……


既然您将使用 for 循环遍历元素 – 为什么不先对元素进行排序。更重要的是,排序列表更容易(阅读:更快)被搜索。


例如,对于 TDeveloper 对象列表,您需要在列表中按姓名、知识或薪水或任何其他属性对开发人员(TDeveloper 的实例)进行排序。


那很无聊!我想要我的列表随机化!

如果需要随机化列表中元素的位置怎么办?有可以使用的“UnSort”方法吗?TStrings(或类似的)中是否有“随机化”方法?不。


想象一副纸牌。是的,你现在看到了。如果您始终知道牌组顶部有哪些牌,那么游戏将会多么有趣。


按排序取消排序

那么如何对列表进行排序呢?好吧,按随机顺序排序。开始:


var

  //TMyObject = class(TObject)

  objects : TObjectList;

begin

  objects := TObjectList.Create(true); //uses System.Generics.Collections

  try

    //"missing" code!

    //add instances of TMyObjects to the "objects" list...


    //randomize / UNSORT / SHUFFLE positions

    objects.Sort(TComparer.Construct(

      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