procedure Split(S: String; List: TStringList; Separator: Char);
var
P, C: PAnsiChar;
S, Buff: String;
begin
List.Clear;
if S = '' then
Exit;
List.BeginUpdate;
(* [Ajusting size - Slow *)
if S[1] = Separator then
Insert('', S, 1);
S := S + Separator;
(* Adjusting size] *)
//Get Pointer to data
P := PChar(S);
//initial position
C := P;
while P^ <> #0 do //check if reached the end of the string
begin
//when found a separator
if P^ = Separator then
begin
if P = C then //check if the slot is empty
Buff := ''
else //when it is not empty, make an string buffer
SetString(Buff, C, P-C);
List.Add(Buff); //add the string into the list
Inc(C, P-C+1); //moves the pointer C to the adress of the pointer P
end;
Inc(P); //go to next char in the string
end;
List.EndUpdate;
end;
此代码工作正常,但在内存中移动字符串 3 次:
在方法调用中(通过复制)
在 Insert('', S, 1)
中串联: S := S + Separator;
我考虑在 S 参数中添加 const 关键字,创建一个内部字符串来复制数据或多或少像这样:
if S[1] = Separator then
begin
SetLength(Str, Length(S)+2);
//HERE!! how to copy the string
Str[1] := ' ';
end
else
begin
SetLength(Str, Length(S)+1);
//HERE!! how to copy the string
end;
//Add Separator in the last position
Str[Length(Str)] := Separator;
因此:
如果 S 包含 ';'
它将创建一个包含 2 个项目('','')的字符串列表。
如果 S 包含“;A”
,它将创建一个包含 2 个项目(“”,“A”)的字符串列表。
如果 S 包含'A;A'
,它将创建一个包含 2 个项目('A','A')的字符串列表。
如果 S 包含 'A;'
它将创建一个包含 2 个项目('A','')的字符串列表。