IndexedList.dpr 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. program IndexedList;
  2. {$APPTYPE CONSOLE}
  3. {$R *.res}
  4. uses
  5. System.SysUtils,
  6. Quick.Commons,
  7. Quick.Console,
  8. Quick.Chrono,
  9. Quick.Lists;
  10. type
  11. TUser = class
  12. private
  13. fId : Int64;
  14. fName : string;
  15. fSurName : string;
  16. fAge : Integer;
  17. published
  18. property Id : Int64 read fId write fId;
  19. property Name : string read fName write fName;
  20. property SurName : string read fSurName write fSurName;
  21. property Age : Integer read fAge write fAge;
  22. end;
  23. const
  24. numusers = 100000;
  25. UserNames : array of string = ['Cliff','Alan','Anna','Phil','John','Michel','Jennifer','Peter','Brandon','Joe','Steve','Lorraine','Bill','Tom'];
  26. UserSurnames : array of string = ['Gordon','Summer','Huan','Paterson','Johnson','Michelson','Smith','Peterson','Miller','McCarney','Roller','Gonzalez','Thomson','Muller'];
  27. var
  28. users : TIndexedObjectList<TUser>;
  29. users2 : TSearchObjectList<TUser>;
  30. user : TUser;
  31. i : Integer;
  32. crono : TChronometer;
  33. begin
  34. try
  35. ReportMemoryLeaksOnShutdown := True;
  36. users := TIndexedObjectList<TUser>.Create(True);
  37. users.Indexes.Add('Name','Name');
  38. users.Indexes.Add('Surname','fSurname',TClassField.cfField);
  39. users.Indexes.Add('id','Id');
  40. users2 := TSearchObjectList<TUser>.Create(False);
  41. cout('Generating list...',etInfo);
  42. //generate first dummy entries
  43. for i := 1 to numusers - high(UserNames) do
  44. begin
  45. user := TUser.Create;
  46. user.Id := Random(999999999999999);
  47. user.Name := 'Name' + i.ToString;
  48. user.SurName := 'SurName' + i.ToString;
  49. user.Age := 18 + Random(20);
  50. users.Add(user);
  51. users2.Add(user);
  52. end;
  53. //generate real entries to search
  54. for i := 0 to high(UserNames) do
  55. begin
  56. user := TUser.Create;
  57. user.Id := Random(999999999999999);
  58. user.Name := UserNames[i];
  59. user.SurName := UserSurnames[i];
  60. user.Age := 18 + Random(20);
  61. users.Add(user);
  62. users2.Add(user);
  63. end;
  64. crono := TChronometer.Create;
  65. //test search by index
  66. crono.Start;
  67. user := users.Get('Name','Peter');
  68. crono.Stop;
  69. if user <> nil then cout('Found by Index: %s %s in %s',[user.Name,user.SurName,crono.ElapsedTime],etSuccess)
  70. else cout('Not found!',etError);
  71. //test search by normal iteration
  72. crono.Start;
  73. for i := 0 to users.Count - 1 do
  74. begin
  75. if users[i].Name = 'Peter' then
  76. begin
  77. crono.Stop;
  78. cout('Found by Iteration: %s %s at %d position in %s',[user.Name,user.SurName,i,crono.ElapsedTime],etSuccess);
  79. Break;
  80. end;
  81. end;
  82. //test search by embeded iteration
  83. crono.Start;
  84. user := users2.Get('Name','Peter');
  85. crono.Stop;
  86. if user <> nil then cout('Found by Search: %s %s in %s',[user.Name,user.SurName,crono.ElapsedTime],etSuccess)
  87. else cout('Not found!',etError);
  88. cout('Press a key to Exit',etInfo);
  89. Readln;
  90. users.Free;
  91. users2.Free;
  92. crono.Free;
  93. except
  94. on E: Exception do
  95. cout('%s : %s',[E.ClassName,E.Message],etError);
  96. end;
  97. end.