মেফের দ্বারা প্রদত্ত বিস্ফোরণ () ফাংশনের অনুরূপ , তবে বেশ কয়েকটি পার্থক্যের সাথে (যার মধ্যে আমি একটি বাগ ফিক্স বিবেচনা করি):
type
TArrayOfString = array of String;
function SplitString(const aSeparator, aString: String; aMax: Integer = 0): TArrayOfString;
var
i, strt, cnt: Integer;
sepLen: Integer;
procedure AddString(aEnd: Integer = -1);
var
endPos: Integer;
begin
if (aEnd = -1) then
endPos := i
else
endPos := aEnd + 1;
if (strt < endPos) then
result[cnt] := Copy(aString, strt, endPos - strt)
else
result[cnt] := '';
Inc(cnt);
end;
begin
if (aString = '') or (aMax < 0) then
begin
SetLength(result, 0);
EXIT;
end;
if (aSeparator = '') then
begin
SetLength(result, 1);
result[0] := aString;
EXIT;
end;
sepLen := Length(aSeparator);
SetLength(result, (Length(aString) div sepLen) + 1);
i := 1;
strt := i;
cnt := 0;
while (i <= (Length(aString)- sepLen + 1)) do
begin
if (aString[i] = aSeparator[1]) then
if (Copy(aString, i, sepLen) = aSeparator) then
begin
AddString;
if (cnt = aMax) then
begin
SetLength(result, cnt);
EXIT;
end;
Inc(i, sepLen - 1);
strt := i + 1;
end;
Inc(i);
end;
AddString(Length(aString));
SetLength(result, cnt);
end;
পার্থক্য:
- aMax পরামিতি স্ট্রিংগুলির সংখ্যার সীমাবদ্ধ করে
- যদি ইনপুট স্ট্রিংটি কোনও বিভাজক দ্বারা বন্ধ করা হয় তবে নামমাত্র "খালি" চূড়ান্ত স্ট্রিংটি বিদ্যমান বলে মনে করা হয়
উদাহরণ:
SplitString(':', 'abc') returns : result[0] = abc
SplitString(':', 'a:b:c:') returns : result[0] = a
result[1] = b
result[2] = c
result[3] = <empty string>
SplitString(':', 'a:b:c:', 2) returns: result[0] = a
result[1] = b
এটি আমি অনুসরণযোগ্য বিভাজক এবং ধারণা "খালি চূড়ান্ত উপাদান" যা আমি বাগ ফিক্স বিবেচনা করি।
আমি প্রস্তাবিত মেমরি বরাদ্দ পরিবর্তনের সাথে সংশোধন করেছি, আমি সংশোধন করে (আমি ভুলভাবে পরামর্শ দিয়েছি ইনপুট স্ট্রিংয়ে প্রায় 50% বিভাজক থাকতে পারে, তবে এটি অবশ্যই 100% বিভাজক স্ট্রিং নিয়ে গঠিত হতে পারে, খালি উপাদানগুলির একটি অ্যারে উত্পাদন করে!)