• 如何更高效的禁止向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以上的时间。

  • 相关阅读:
    c++(递归和堆栈)
    Halcon算子翻译——dev_set_line_width
    Halcon算子翻译——dev_set_draw
    Halcon算子翻译——dev_set_colored
    Halcon算子翻译——dev_set_color
    Halcon算子翻译——dev_open_window
    Halcon算子翻译——dev_open_tool
    Halcon算子翻译——dev_open_file_dialog
    Halcon算子翻译——dev_open_dialog
    Halcon算子翻译——dev_map_var
  • 原文地址:https://www.cnblogs.com/hssbsw/p/2533102.html
Copyright © 2020-2023  润新知