了解Delphi 6 container

ZDNet软件频道 时间:2002-03-01 作者:ZDNET CHINA 特稿 |  我要评论()
本文关键词:
Container(容器)是按一种有效方式存储大量items的地方,它通常包括一系列或一套items。Container为items的存储方式赋予了特殊含义。本文的例子包括结构列表、顺序列表、堆栈和队列。

TQueue and TObjectQueue

在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按钮时,如你所见,它们在表格中列出了所有部分,但顺序被颠倒了-本应该是这样。

Custom ordering

好,现在stack和queue已经可以把items加到list的一端或另一端了。但是我们如何按照自己特殊的方式来插入items呢?假定我们想要从表格中加入一些部分但是仍然要保持已存的list还基于原来的名字。那么,我们必须创建一个新的TsortedList类(源于TOrderedList)并且忽略PushItem法以确保这个新的item被插到了正确位置。

为此,首先需要找到这个新item本应该插入到的位置(假定list随时保存,也就是从开始一直到当前item命名成功)。

不巧的是,没有RTTI就不能采用一种单纯的方式来访问所存储的部分,所以还必须忽略Push, Pop, 和Peek方法,才能用Tobject代替指针。TobjectSortedList的整个声明及执行过程见Listing A

显然,这些代码并不十分有效,因为我们采用的是线性方法来搜索下一个位置插入新item,其实本应该采用二进制搜索法来进行优化(其中一部分做为你们的练习来做;如果需要帮助可以找我)。

Final usage

在最后的部分代码中可以看到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进行分类。就象俗语说的那样:天空是有限的,而想象力是无限的。

责任编辑:超凡

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134