【发布时间】:2012-08-16 12:47:30
【问题描述】:
我有一个 TStringList 已排序并包含唯一的文件名。该列表可以是任意大小(因此可以是数十万个条目)。我想检查是否有任何条目以特定字符串开头(即文件是否在子文件夹中)。连续扫描列表并使用 StartsText 很容易,但这不是一个理想的解决方案。
使用 TStringList.Find() 代码作为起点,我创建了一个我认为是解决方案的函数,但我想确定一下。不要担心以下不是类的成员(FList 是被搜索的 TStringList 实例),StartsFilename 的工作方式与 StartsText 相同:
function ShortcutFind(const S: string): Boolean;
var
L, H, I, C: Integer;
begin
Result := False;
L := 0;
H := FList.Count - 1;
while L <= H do begin
I := (L + H) shr 1;
if TFilenameUtils.StartsFilename(FList[I], aFolder) then begin
Result:=TRUE;
Exit;
end;
C := FList.CompareStrings(FList[I], S);
if C < 0 then
L := I + 1
else begin
H := I - 1;
if C = 0 then begin
Result := True;
if FList.Duplicates <> dupAccept then L := I;
end;
end;
end;
end;
基本上,唯一真正的变化是它在移动到下一个要比较的条目之前进行检查。
请注意,不能从 TStringList 切换。
这种方法行得通吗?
谢谢
【问题讨论】:
-
“行得通吗?”你不能试一试就知道吗?该代码可能更简单,但如果您只想对您的代码进行评论,您可以转而访问 Stack Overflow 的“代码审查”站点。否则,我不确定您真正要求的是什么。
-
我编写了一个测试例程来测试它,它似乎可以工作。我想我真的只是在问是否有任何明显的漏洞或更好/更快的方法(在将其保留为 TStringList 的限制下)。 Tnaks。
-
效率重要吗?切换到二分搜索可能会在该领域快速获胜。
-
@Boileau,该代码已经进行了二分搜索。
-
哎呀,我看错了代码!傻我。在这种情况下,我会投票赞成您的解决方案。
标签: delphi tstringlist