Registriert seit: 26. Mai 2005
37 Beiträge
Turbo Delphi für Win32
|
Re: Prozedur zu langsam, Optimierung nötig
17. Mär 2007, 21:55
Nun habe ich die stringliste mal einfach mit liste1.sort sortiert. Die Suche kann nun sofort beendet werden, wenn es keine Übereinstimmung der Koordinaten gibt. Das gefundene wird ebenfalls sofort gelöscht. Nun dauert es nur noch 10 Sekunden auf dem E6600. Allerdings habe ich nun ein anderes Problem. Die liste.sort Funktion scheint den String irgendwie zu verändern. Im Editor sehen die beiden Ausgangs Dateien zwar gleich aus, MapInfo erkennt aber beim Einlesen die Werte alle nur noch als Zeichen. Ohne sort erkennt es die Koordinaten als Float und RXL als Integer. Kann man zwar hinterher wieder ändern, ist aber mehr Aufwand. Allerdings geht das Zeichnen dafür bei der sortierten Liste deutlich schneller. Was verändert sort am Format?
Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var
rxl: string;
suchkoor: string;
Koor: Array[0..1000] of string[35];
i,l,k,j,maxi,cl: Integer;
maxrxl: Integer;
Liste1: Tstringlist;
Liste2: Tstringlist;
begin
Screen.Cursor:=crHourglass;
DecimalSeparator:='.';
liste1:=Tstringlist.Create;
liste1.LoadFromFile(OpenDialog1.FileName);
// Jetzt wird sortiert
liste1.sort;
l:=liste1.Count;
progressbar1.Min:=-l;
progressbar1.Max:=0;
liste2:=Tstringlist.Create;
liste2.add('lon'+chr(9)+'lat'+chr(9)+'RXL'+chr(9)+'CID'+chr(9)+'BCCH');
repeat
suchkoor:=copy(Liste1[1],1,GetPosNumX(chr(9),Liste1[1],2)-1);
k:=0;
i:=1;
repeat
if (pos(suchkoor,liste1[i])>0) then
begin
koor[k]:=liste1[i];
k:=k+1;
liste1.Delete(i);
i:=i-1;
end
//neuer else zweig zum Abbruch der Suche
else i:=liste1.Count-1;
i:=i+1;
cl:=Liste1.Count;
until i=cl;
maxrxl:=-200;
maxi:=0;
progressbar1.position:=-cl;
if k=1 then
begin
liste2.Add(koor[0]);
end
else if k>1 then
begin
for j := 0 to k - 1 do
begin
rxl:=copy(koor[j],GetPosNumX(chr(9),koor[j],2)+1,GetPosNumX(chr(9),koor[j],3)-GetPosNumX(chr(9),koor[j],2)-1);
if strtoint(rxl)>maxrxl then
begin
maxrxl:=strtoint(rxl);
maxi:=j;
end;
end;
liste2.Add(koor[maxi]);
end;
until liste1.Count=1;
liste2.SaveToFile(extractfilepath(OpenDialog1.FileName)+'Best_sorted.txt');
liste1.Destroy;
liste2.Destroy;
Screen.Cursor:=crDefault;
end;
|
|
Zitat
|