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

 我们在编写程序时,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以上的时间。

posted on 2012-06-03 21:14  为人民服务  阅读(1067)  评论(0编辑  收藏  举报