gpt4 book ai didi

delphi - 如何跳出这个循环?

转载 作者:行者123 更新时间:2023-12-03 15:18:06 25 4
gpt4 key购买 nike

这是一个在delphi中排序的 ListView ,有50000个项目(字符串)。如何快速搜索具有相同前缀词的项目,然后跳出循环?

列表如下:

aa.....
ab cd//from here
ab kk
ab li
ab mn
ab xy// to here
ac xz
...

我的意思是如何快速查找和复制带有 ab 前缀的项目并跳过循环。假设在二分搜索中获得了 ab 项之一的索引。通过二分查找得到ab cd 到ab xy 的索引。

非常感谢。

编辑:我们感谢大家的回答。

最佳答案

如果你想要快速的东西,不要将数据存储在 TListView 中。

使用 TStringList 存储列表,然后在虚拟模式下使用 TListView。

从 TStringList.Items[] 读取比从 TListView.Items[] 属性读取快很多倍。

如果您确定列表中不存在空项目,请使用此:

procedure Extract(List, Dest: TStrings; Char1, Char2: char);
var i,j: integer;
V: cardinal;
type PC = {$ifdef UNICODE}PCardinal{$else}PWord{$endif};
begin
V := ord(Char1)+ord(Char2) shl (8*sizeof(char));
Dest.BeginUpdate;
Dest.Clear;
for i := 0 to List.Count-1 do begin
if PC(pointer(List[i]))^=V then begin
for j := i to List.Count-1 do begin
Dest.Add(List[j]);
if PC(pointer(List[j]))^<>V then
break; // end the for j := loop
end;
break; // end the for i := loop
end;
Dest.EndUpdate;
end;

您可以使用二分搜索来更快地获得它。但使用 PWord() 技巧,在 50000 个项目列表上,您将不会注意到它。

请注意,PC(pointer(List[i]))^=V 是 copy(List[i],1,2)=Char1+Char2 的更快版本,因为在比较过程中不会创建临时字符串。但只有在没有 List[i]='' 时才有效,即没有指针(List[i])=nil。

我添加了 {$ifdef UNICODE} 和 sizeof(char) 以便使此代码能够与所有版本的 Delphi(Delphi 2009 之前和之后)一起编译。

关于delphi - 如何跳出这个循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4297018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com