在stack(和ObjectStack)按LIFO方式存储参照内容时,理所当然,queue采用FIFO方式:先进先出。这种数据结构对任务管理和意图规划是异常优秀的。而且,在Tobject只存储指针的地方,TObjectQueue存储objects同时支持RTTI。
下面的例子仍然是从当前表格push所有部分(但这次是在序类的另一个尾端),同时使用Pop滤过整个队列,再次排列出所有部分,当然这次是按顺序的。
程序TForm1.btnQueueClick(Sender: TObject);
var
i: Integer;
ObjectQueue: TObjectQueue;
Begin
ObjectQueue := TObjectQueue.Create;
Try
for i:=0 to Pred(ComponentCount) do
ObjectQueue.Push(Components[i]);
// Usage of OrderedList...
Memo1.Lines.Clear;
while ObjectQueue.Count > 0 do
Memo1.Lines.Add((ObjectQueue.Pop AS TComponent).Name)
Finally
ObjectQueue.Free
End
end;
当点击Stack按钮和Queue按钮时,如你所见,它们在表格中列出了所有部分,但顺序被颠倒了-本应该是这样。
好,现在stack和queue已经可以把items加到list的一端或另一端了。但是我们如何按照自己特殊的方式来插入items呢?假定我们想要从表格中加入一些部分但是仍然要保持已存的list还基于原来的名字。那么,我们必须创建一个新的TsortedList类(源于TOrderedList)并且忽略PushItem法以确保这个新的item被插到了正确位置。
为此,首先需要找到这个新item本应该插入到的位置(假定list随时保存,也就是从开始一直到当前item命名成功)。
不巧的是,没有RTTI就不能采用一种单纯的方式来访问所存储的部分,所以还必须忽略Push, Pop, 和Peek方法,才能用Tobject代替指针。TobjectSortedList的整个声明及执行过程见Listing
A。
显然,这些代码并不十分有效,因为我们采用的是线性方法来搜索下一个位置插入新item,其实本应该采用二进制搜索法来进行优化(其中一部分做为你们的练习来做;如果需要帮助可以找我)。
在最后的部分代码中可以看到TobjectSortedList的使用。(注意我们用的是RTTI而且demo结果的所有部分都是按字母表顺序列出。)
程序TForm1.btnSortedListClick(Sender: TObject);
var
i: Integer;
SortedList: TObjectSortedList;
Begin
SortedList := TObjectSortedList.Create;
Try
for i:=0 to Pred(ComponentCount) do
SortedList.Push(Components[i]);
// Usage of OrderedList...
Memo1.Lines.Clear;
while SortedList.Count > 0 do
Memo1.Lines.Add((SortedList.Pop AS TComponent).Name)
Finally
SortedList.Free
End
end;
当然,你也可以采用任何其他方式或标准对objects进行分类。就象俗语说的那样:天空是有限的,而想象力是无限的。