/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Optimering af streng-rutine
Fra : Thomas Holmgren


Dato : 31-10-05 20:36

Hej alle!

Jeg har en funktion som tager en kommasepareret streng som input og
returnerer et array med hvert element. Dvs.

strengen 'a;b;c' bliver til

arr[0] = 'a'
arr[1] = 'b'
arr[2] = 'c'

Jeg har lavet funktionen som vist herunder. Problemet er at den kører
lidt langsomt efter min smag.. Med 20.000 elementer i input-strengen kan
den finde på at køre flere min. Jeg har lavet den så effektivt som jeg
kunne (udfra et eks. på nettet), men vil gerne høre om nogen har gode
ideer? Det må ku' gøres bedre! :)

Herunder følger funktion:

TStringArray er et array af strenge,
input er en semikolon-delimited streng,
count er antallet af semikolonner i inputstrengen.


function StringSplit(input : string; count : integer) : TStringArray;
var
i, n : integer;
p, q, s : PChar;

begin
SetLength(Result, count + 1);
p := PChar(input);
s := PChar(';');
n := 1;
i := 0;

repeat
q := AnsiStrPos(p, s);
if q = nil then
q := AnsiStrScan(p, #0);
SetString(Result[i], p, q - p);
p := q + n;
inc(i);
until q^ = #0;
end;

 
 
Thomas Holmgren (31-10-2005)
Kommentar
Fra : Thomas Holmgren


Dato : 31-10-05 21:20

Hej igen

Jeg prøvede lige at sammenligne min string-split-metode med metoden
indbygget i TStringList. Den kører godt nok stærkt. Bruger jeg følgende
i min funktion:

Strings.Delimiter := ';';
Strings.DelimitedText := Input;

for i := 0 to Strings.Count - 1 do
begin
Result[i] := Strings.Strings[i];
end;

...går det lige knap 150 gange så hurtigt på min test-streng med 20.000
elementer. :)


thm


Thomas Holmgren wrote:

> Hej alle!
>
> Jeg har en funktion som tager en kommasepareret streng som input og
> returnerer et array med hvert element. Dvs.
>
> strengen 'a;b;c' bliver til
>
> arr[0] = 'a'
> arr[1] = 'b'
> arr[2] = 'c'
>
> Jeg har lavet funktionen som vist herunder. Problemet er at den kører
> lidt langsomt efter min smag.. Med 20.000 elementer i input-strengen kan
> den finde på at køre flere min. Jeg har lavet den så effektivt som jeg
> kunne (udfra et eks. på nettet), men vil gerne høre om nogen har gode
> ideer? Det må ku' gøres bedre! :)
>
> Herunder følger funktion:
>
> TStringArray er et array af strenge,
> input er en semikolon-delimited streng,
> count er antallet af semikolonner i inputstrengen.
>
>
> function StringSplit(input : string; count : integer) : TStringArray;
> var
> i, n : integer;
> p, q, s : PChar;
>
> begin
> SetLength(Result, count + 1);
> p := PChar(input);
> s := PChar(';');
> n := 1;
> i := 0;
>
> repeat
> q := AnsiStrPos(p, s);
> if q = nil then
> q := AnsiStrScan(p, #0);
> SetString(Result[i], p, q - p);
> p := q + n;
> inc(i);
> until q^ = #0;
> end;

Finn Bindeballe (31-10-2005)
Kommentar
Fra : Finn Bindeballe


Dato : 31-10-05 23:09

hej....

Hvis jeg var dig, ville jeg bruge en TStringlist.... den kan.... og er
hurtig....

/F

Søg
Reklame
Statistik
Spørgsmål : 177435
Tips : 31962
Nyheder : 719565
Indlæg : 6408016
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste