如何更高效的禁止向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以上的时间。
//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以上的时间。
相关文章推荐
- C#如何将Access中以时间段条件查询的数据添加到ListView中
- 如何向Listview中的各列添加数据?
- Struts中禁止刷新Action重复添加数据
- [代码问题解决录A1]c#Listview控件动态添加数据并阻止重复添加
- [代码问题记录Q1]c#Listview动态添加数据时阻止重复添加
- Vue如何添加重复数据
- android ListView内数据的动态添加与删除
- 如何读取Infopath中的重复表和重复节中的数据
- 我的Android进阶之旅------>Android的ListView数据更新后,如何使最新的条目可以自动滚动到可视范围内?
- C#中使用ListView动态添加数据不闪烁并显示当前插入值
- Oracle中如何删除重复数据
- 如何在list中删除重复的数据单元
- C#中使用ListView动态添加数据不闪烁
- 从getView()重复调用浅谈listview数据装载机制
- [Android新手学习笔记23]-如何使用ListView展示列表数据
- 打造Android集合控件数据绑定(支持添加监听,支持AbsListView与RecycleView,支持异步加载等)(二)ORM注解以及解析
- 如何对数据量8亿的表中数据去重复…
- List添加Item时, 如何去判断某个字段, 并且保证字段数据不重复性
- 如何给已经有数据的表添加一个新的ID
- [VB.NET]请教高手:如何使用listview控件从缓冲区中一次性添加多条数据???