FList与THashedStringList有什么区别,该如何根据条件判断使用哪个?(100分)

  • 主题发起人 主题发起人 wuchunhua
  • 开始时间 开始时间
W

wuchunhua

Unregistered / Unconfirmed
GUEST, unregistred user!
FList与THashedStringList有什么区别,该如何根据条件判断使用哪个?
大家讨论讨论
 
THashedstringlist,在iniFiles中定义, 速度非常快,基于哈希表的,用indexof定位,速度比传统的Tstringlist快上几百倍,数据多更明显。
 
量大用后者,量小用前者
 
量大用后者,量小用前者

自己两个都测试下,,看哪个好用些
 
遇到一个奇怪的问题:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s: myrecord;
begin
HashList := THashedStringList.Create ;
for i:= 1 to 20 do
begin
s := myrecord.Create ;
s.name :='sdf';
s.age := i ;
if i= 100 then
HashList.AddObject(inttostr(i),s)
else
HashList.AddObject(inttostr(i),s);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
for i:= HashList.Count -1 downto 0 do
begin
memo1.Lines.Add(myrecord(HashList.Objects).name + IntTostr(myrecord(HashList.Objects).age ))
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
index: integer ;
str: string ;
i: integer;
begin
for i:= 1 to 20 do
begin
str:= inttostr(i);
if HashList.Find(str, index) then
memo1.Lines.Add(myrecord(HashList.Objects[index]).name + IntTostr(myrecord(HashList.Objects[index]).age ))
end;
end;

先电击了button1创建了20个对象,点击button2,Memo1中可以从
sdf20
sdf19
sdf18
sdf17
sdf16
sdf15
sdf14
sdf13
sdf12
sdf11
sdf10
sdf9
sdf8
sdf7
sdf6
sdf5
sdf4
sdf3
sdf2
sdf1 //也就是全部都显示出来了

可是点button3显示出来的只有
sdf1
sdf10
sdf11
sdf12
sdf13
sdf14
sdf15
sdf16
sdf17
sdf18
sdf19
sdf20

请高手解决
 
问题已经解决,不能用Find,应该用indexof(str) 奇怪了,find既然有问题,为什么还有这么一个属性.
 
原因在于Find用的是二分法,如果你找'3'的时候,它就去11以后找了,也就再也找不到了
 
function TStringList.Find(const S: string
var Index: Integer): Boolean;
var
L, H, I, C: Integer;
begin
Result := False;
L := 0;
H := FCount - 1;
while L <= H do
begin
I := (L + H) shr 1;
C := CompareStrings(FList^.FString, S);
if C < 0 then L := I + 1 else
begin
H := I - 1;
if C = 0 then
begin
Result := True;
if Duplicates <> dupAccept then L := I;
end;
end;
end;
Index := L;
end;
 
因为'3'>'10',还是字符比较的问题
 
呵呵 结贴了,问题自己发现,就不另外开贴了 谢谢Clip_on
 
后退
顶部