速度问题是个大问题啊

解决方案 »

  1.   

    放入数据库,用sql语句~~~呵呵,自已随便怎么写都成,但是不一定是最快的
      

  2.   

    你要自己封装,TStringList查找不快的。如果你排序之后会快。
      

  3.   

    这类问题用hash散列+链表解决
      

  4.   

    var
      vStrings: TStringList;
      S: string;
      I: Integer;
      vTickCount: Longword;
    begin
      vStrings := TStringList.Create;
      vStrings.Sorted := True; // 排序后我的机器是200毫秒如果不排序是1800毫秒
      vTickCount := GetTickCount;
      for I := 1 to 100000 do
      begin
        S := IntToStr(Random(100));
        if vStrings.IndexOf(S) < 0 then
          vStrings.Add(S);
      end;
      Caption := Format('Count:%d Time:%dMS', [
        vStrings.Count, GetTickCount - vTickCount]);
      vStrings.Free;
    end;如果用hash会更快
      

  5.   

    123
    abc
    123  //这个得找出来
    hhj
    abc //这个得找出来 
      

  6.   

    试下这个:procedure TForm1.Button1Click(Sender: TObject);
    var
     i,j,c:integer;
     s:TStringList;
    begin
     s:=TStringLIst.Create;
     s.CommaText:='123,abc,123,hhj,abc';
     s.SaveToFile('C:\A.txt');//保存源数据。
     c:=s.Count-1; //为提高效率,先保存记录总数。
     for i:=0 to c do
      for j:=i+1 to c do
       if s.Strings[i]=s.Strings[j] then
        s.Strings[j]:='*'+s.Strings[j];//作删除标记。
     s.SaveToFile('C:\B.txt');
     s.Free;
    end;
      

  7.   

    hash用indexof可以快速查找大位置,但无法找到第二个,比如:
    123  //indexOf('123')的话,只能定位到这里,不能定位到下一个'123',
       //所以无法判断'123'是否重复
    abc 
    123 //这个得找出来 
    hhj 
    abc //这个得找出来  
    ==============使用这样的方法:找到第一个'123',然后delete hash,再重新找下一个'123',
    那么,delete hash的过程很漫长,跟8楼mwy654321的时间差不多。
      

  8.   

    大家有兴趣可以测试一下如下代码:注意,要包含IniFiles单元
    var
      ScHash:THashedStringlist;
      Index,i,k,n:Integer;
      vTickCount: Longword;
      t_Object : TObject;
    begin
      ScHash:=THashedStringlist.Create;
      for i := 10000 to 20000 do
      begin
        ScHash.AddObject(IntToStr(i) + '测试字符串',Pointer(i));
      end;
      vTickCount := GetTickCount;
      K :=  ScHash.Count;
      i := 1;
      n := 0;
      while(i<k) do
      begin
        Inc(n);
        i := i + 4; //这句可以调节操作的次数,不加的话,操作10000次
        Index:=ScHash.IndexOf(IntToStr(i+10000) + '测试字符串');
        if Index<>-1 then
        begin
          t_Object:=ScHash.Objects[Index];
          ScHash.Delete(Index); //去掉这一句的话,速度很快
           Dec(k);
        end;
      end;
      Self.Caption := Format('Count:%d Time:%dMS', [n, GetTickCount - vTickCount]);
      ScHash.Free;
    end;
      

  9.   

    同意楼上 建议HashedStringList
      

  10.   

    我试了11楼的程序,果然很快。为什么THashedStringlist效率会高?能不能解决一下原因。
      

  11.   

    另外你的变量t_Object定义了有什么作用?
    t_Object:=ScHash.Objects[Index];是什么意思?好像去掉这句也没有影响吧?