您的位置:首页 > 其它

如何更高效的禁止向LISTVIEW添加重复数据

2012-06-03 21:14 399 查看
我们在编写程序时,LISTVIEW是一个常用的控件,我们经常要向LISTVIEW控件添加大量的数据,而其中有些数据是不能重复的,一般情况下,我们会采用以下方法来编写程序
//stTest是将要添加的数据
for i:=0 to listview1.item.count-1 do
begin
if stTest=listview1.items[i].caption {假设CAPTION不能相同}
then break
else
begin
item:=listview1.items.add;
item.caption:=stTest;
end;
end;
采用这种方式是网络上和一些编程教程常用的写法,当LISTVIEW数据量较少时,这种方法不会产生什么问题,但当数据量大到几千条以上时,速度会慢得出奇。经过测试,我发现以下方法可以更快的在LISTVIEW中找出重复数据。
首先要设置SORTTYPE=SZTEXT (排序方式可以不同),检测重复的代码如下:

ITEM:=LISTVIEW1.Items.Add; //先添加数据,因为设置了排序,LISTVIEW控件会将这条数据按排序位添加
ITEM.Caption :=stTest;
same:=false; //先假设没有相同的。
if (item.Index =0) AND (LISTVIEW1.Items.Count >1) THEN {排在第1位而且数据条数>1,检测下一条是否和自己相同。}
BEGIN
IF (item.Caption =listview1.Items[1].Caption) then same:=true; //same=true 即发现相同的
END
else
if (item.Index =listview1.Items.Count-1) AND (LISTVIEW1.Items.Count >1) then {排最后1位且数据条数>1,检测上条是否和自己相同。}
BEGIN
if item.Caption =Listview1.Items[ITEM.INDEX-1] .Caption then same:=true ;
END
else
IF ITEM.INDEX>0 THEN {排在第2位至倒数第2位时,检测自己的上一条和下一条是否和自己相同}
BEGIN
if item.Caption =Listview1.Items[ITEM.INDEX-1] .Caption then same:=true ;
if item.Caption =Listview1.Items[ITEM.INDEX+1] .Caption then same:=true ;
END;
If same then begin item.Delete;exit;end; //如果有相同数据,删除刚刚添加的。

实际测试情况:
电脑配置为 C4 2.8 1G内存,操作系统 windowx 2003 server
程序遍历一个目录下(包括其下的子目录)的所有JPG文件,将JPG文件名放到LISTVIEW中。JPG文件2490个,重复的40个。
(1)不排序,不禁止重复。遍历分区并添加全部JPG文件,需时5秒。
(2)是排序,采用我所说的方法,同样遍历分区并添加全部JPG文件并禁止重复,需时32秒
(3)不排序,采用传统算法,遍历分区并添加全部JPG文件并禁止重复,需时1分50秒
当遍历一个分区,5万多个文件,1200多个目录,JPG文件10245个时,测试结果如下:
(1)25秒左右 (2)6分44秒 (3)26分35秒

以上每种算法都经过多次测试,在相同条件下,每次所需时间都与测试结果相当。由此可见,数据量越大,以上算法所花费时间的差异就更明显了,虽然第(1)种更快,但由于它没有禁止重复,与后两种没有太大的可比性,只是作为一个参考值,而第(2)种比第(3)种节约了2/3以上的时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: