Làm thế nào để một mảng chuỗi được chuyển thành chuỗi (Với dấu tách char)? Tôi có nghĩa là, có một số chức năng hệ thống tôi có thể sử dụng thay vì viết chức năng của riêng tôi?Làm thế nào để nối chuỗi các phần tử chuỗi thành một chuỗi
Trả lời
Vì bạn đang sử dụng Delphi 2007 bạn phải làm điều đó bạn tự:
function StrArrayJoin(const StringArray : array of string; const Separator : string) : string;
var
i : Integer;
begin
Result := '';
for i := low(StringArray) to high(StringArray) do
Result := Result + StringArray[i] + Separator;
Delete(Result, Length(Result), 1);
end;
Đơn giản chỉ cần đi qua mảng và concat nó với seperator của bạn.
Và một ví dụ thử nghiệm nhỏ:
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption :=StrArrayJoin(['This', 'is', 'a', 'test'], ' ');
end;
Tôi đã viết chức năng của riêng mình! Cảm ơn bạn đã đề xuất! – Hwau
Không lý tưởng về mặt tốc độ –
Trong delphi cho .NET, bạn có thể sử dụng chức năng khuôn khổ Join, trong khi nếu bạn không muốn dựa vào khuôn khổ NET thì bạn có thể liên kết các thư viện mã nguồn mở JCL: hãy nhìn vào các IJclStringList interface của thư viện .
JclStringList.Join(',');
Nếu như ai đó đề nghị trong ý kiến bạn chỉ có thể sử dụng một TStringList theo cách này:
arrayList.Delimiter := ',';
arrayList.QuoteChar := '';
joinedArray := arrayList.DelimitedText;
Lưu ý rằng phiên bản mới nhất của Delphi XES (kể từ XE3 nếu tôi cũng nhớ) có một TStringHelper lớp bổ sung phương thức Join vào lớp Chuỗi:
class function Join(const Separator: string; const Values:
IEnumerator<string>): string; overload; static;
Bạn muốn quá tải 'Tham gia' chấp nhận một mảng mở của' chuỗi'. Tất nhiên, 'Tham gia', là một phần của trình trợ giúp chuỗi, được thực hiện rất kém. Phiên bản 'IEnumerable
Câu trả lời được chấp nhận không phải là lý tưởng về mặt tốc độ, đặc biệt là nếu có nhiều chủ đề được sử dụng. Cách tiếp cận này nhanh gấp 3 lần trên lõi đơn, và cân đối tốt trên SMP.
function JoinStrings(const s: array of string; Delimiter: Char): string;
var
i, c: Integer;
p: PChar;
begin
c := 0;
for i := 0 to High(s) do
Inc(c, Length(s[i]));
SetLength(Result, c + High(s));
p := PChar(Result);
for i := 0 to High(s) do begin
if i > 0 then begin
p^ := Delimiter;
Inc(p);
end;
Move(PChar(s[i])^, p^, SizeOf(Char)*Length(s[i]));
Inc(p, Length(s[i]));
end;
end;
Tốc độ kiểm tra:
program Project1;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils, StrUtils, Classes;
function StrArrayJoin(const StringArray: array of string; const Separator: string) : string;
var
i : Integer;
begin
Result := '';
for i := low(StringArray) to high(StringArray) do
Result := Result + StringArray[i] + Separator;
Delete(Result, Length(Result), 1);
end;
function JoinStrings(const s: array of string; Delimiter: Char): string;
var
i, c: Integer;
p: PChar;
begin
c := 0;
for i := 0 to High(s) do
Inc(c, Length(s[i]));
SetLength(Result, c + High(s));
p := PChar(Result);
for i := 0 to High(s) do begin
if i > 0 then begin
p^ := Delimiter;
Inc(p);
end;
Move(PChar(s[i])^, p^, SizeOf(Char)*Length(s[i]));
Inc(p, Length(s[i]));
end;
end;
var
TestData: array of string;
type
TTestThread = class(TThread)
protected
Func: Boolean;
Count: Integer;
procedure Execute; override;
end;
procedure TTestThread.Execute;
var
dtStart: TDateTime;
i: Integer;
begin
dtStart := Now;
Count := 0;
repeat
for i := 1 to 1000 do
if Func then
JoinStrings(TestData, ';')
else
StrArrayJoin(TestData, ';');
InterlockedIncrement(Count);
until Now > dtStart + 1/86400;
end;
procedure TestSmp(CpuCount: Integer; Func: Boolean);
var
i, c: Integer;
Threads: array of TTestThread;
begin
SetLength(Threads, CpuCount);
for i := 0 to High(Threads) do begin
Threads[i] := TTestThread.Create(true);
Threads[i].Func := Func;
Threads[i].Resume;
end;
c := 0;
for i := 0 to High(Threads) do begin
Threads[i].WaitFor;
Inc(c, Threads[i].Count);
Threads[i].Free;
end;
WriteLn(c);
end;
procedure Init();
var
i: Integer;
begin
SetLength(TestData, 1000);
for i := 0 to High(TestData) do
TestData[i] := DupeString('x', Random(32));
end;
begin
try
Init();
Assert(StrArrayJoin(TestData, ';') = JoinStrings(TestData, ';'));
TestSmp(1, false);
TestSmp(1, true);
TestSmp(4, false);
TestSmp(4, true);
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
Readln;
end.
Kết quả: trên một quad-core CPU JoinStrings là 12x nhanh hơn.
StrArrayJoin 1 thread: 55
JoinStrings 1 thread: 184
StrArrayJoin 4 threads: 58
JoinStrings 4 threads: 713
- 1. Làm thế nào để nối thêm một chuỗi vào mỗi phần tử của một mảng Bash?
- 2. Làm thế nào để nối hai nguyên tử/chuỗi?
- 3. Làm thế nào để nối một chuỗi với một biến?
- 4. làm thế nào để nối chuỗi?
- 5. Làm thế nào để nối/nối thêm một chuỗi vào chuỗi khác trong Jekyll/Liquid?
- 6. Làm thế nào để xóa một phần tử từ một danh sách các chuỗi trong R
- 7. Làm thế nào để tách một chuỗi thành các chuỗi có chiều dài nhất định?
- 8. Trong R: Nối các phần tử vectơ theo hàng, chuyển đổi các hàng vectơ thành chuỗi
- 9. Cách nhanh nhất để chuyển đổi danh sách các chuỗi thành một chuỗi được ghép nối?
- 10. chuỗi định dạng của chuỗi các thành phần mảng một phần
- 11. F # Thêm phần tử vào một chuỗi
- 12. Làm thế nào để nối `Object` bằng một chuỗi?
- 13. Làm thế nào để nối hai chuỗi trong sql và pad một chuỗi với 0?
- 14. Làm cách nào để trích xuất phần tử con từ XML thành một chuỗi trong Java?
- 15. Làm cách nào để sắp xếp một chuỗi các chuỗi?
- 16. Làm thế nào để chuyển chuỗi vào Rails một phần?
- 17. Làm cách nào để triển khai một chuỗi các chuỗi?
- 18. Làm cách nào để chuyển đổi bộ sưu tập chuỗi Groovy thành một chuỗi chuỗi Java?
- 19. Làm thế nào để chuyển đổi chuỗi thành Hex và Hex thành chuỗi?
- 20. PHP: Nối phần tử mảng thành chuỗi bằng dấu ',' làm dấu phân cách
- 21. Kiểm tra xem một chuỗi có chứa một phần tử từ một danh sách (các chuỗi)
- 22. Làm thế nào để chuyển đổi từ chuỗi thành mảng?
- 23. đếm các phần tử trong chuỗi
- 24. Chuỗi chuỗi Android thành mảng
- 25. Chuỗi nối với chuỗi()
- 26. Lọc các phần tử chuỗi NSArray
- 27. Làm cách nào để nối chuỗi?
- 28. T-SQL nối các hàng thành chuỗi
- 29. Làm cách nào để lọc các phần tử từ một chuỗi dựa trên các chỉ mục
- 30. Làm thế nào để chuyển đổi một chuỗi thành CharSequence?
Phiên bản Delphi nào? –
@KenWhite: Phiên bản là Delphi2007 – Hwau
Bạn có thể sử dụng TStringList với Dấu phân tách. Hoặc bạn có thể viết cho bạn chức năng riêng. Tôi sẽ tránh TStringList. Không cần phải làm một ví dụ cho việc này. –