zoukankan      html  css  js  c++  java
  • 如何更高效的禁止向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以上的时间。

  • 相关阅读:
    Python for Infomatics 第14章 数据库和SQL应用四(译)
    展望2017
    bing的简单英文字典工具
    自我安慰
    Python for Infomatics 第14章 数据库和SQL应用三(译)
    Python for Infomatics 第14章 数据库和SQL应用二(译)
    Python for Infomatics 第14章 数据库和SQL应用一(译)
    希望父亲早日恢复
    Python for Infomatics 第13章 网页服务四(译)
    Python for Infomatics 第13章 网页服务三(译)
  • 原文地址:https://www.cnblogs.com/hssbsw/p/2533102.html
Copyright © 2011-2022 走看看