![]() |
Funktion schneller machen?
Hallihallo :-D
Folgendes Problem: ich habe eine StringList (LISTE1) mit ca. 10.000 Einträgen der Form: LISTE1: Key1=Wert1 Key1=Wert2 Key1=Wert3 Key1=Wert4 Key1=Wert5 Key1=Wert6 Key2=Wert1 Key2=Wert2 Key2=Wert3 Key2=Wert4 Key2=Wert5 Key2=Wert6 Key3=Wert1 Key3=Wert2 Key3=Wert3 Key4=Wert1 Key4=Wert2 Key4=Wert3 usw. D.h.: es gibt mehrere gleichlautende "key"s und dazu jeweils unterschiedliche Werte, wobei die Anzahl der Paare schwankend ist. Also manchmal hat ein key 10 verschiedene Werte und ein anderer key eben nur mal 3 oder so. Bis hierhin, ok. Nun habe ich eine weitere Liste (LISTE2) mit ca. 700 Einträgen, die nur aus "key"s besteht, also: LISTE2: key1 key3 key4 key8 key11 Jetzt muss ich diese 700 Einträge abarbeiten und in der Liste mit den 10.000 Einträgen schauen, ob der key vorhanden ist und wenn ja, seine entsprechenden Werte "einsammeln". Bisher hab ich's so gemacht:
Delphi-Quellcode:
So, mit der Methode dauerts halt schon ein paar Sekunden.
for i := 0 to LISTE2.Count -1 do
begin if NOT(LISTE1.IndexOfName(LISTE2.Strings[i]) = -1) then begin while NOT(LISTE1.IndexOfName(LISTE2.Strings[i]) = -1) do begin //schreibe zugehörigen WERT in andere Liste LISTE1.Delete(LISTE1.IndexOfName(LISTE2.Strings[i])); end; end; end; Kennt ihr vllt. ne bessere Möglichkeit, um das ganze etwas zu beschleunigen? Bin für jeden brauchbaren Hinweis dankbar! Grüße, der Paule :) |
Re: Funktion schneller machen?
|
Re: Funktion schneller machen?
Das Problem bei deinem Algorithmus ist das du zuoft IndexOfName verwendest, diese Methode durchsucht die Stringliste jedesmal von vorne!
Probier es mal so hier:
Delphi-Quellcode:
for i := 0 to LISTE2.Count-1 do
begin for j := LISTE1.Count-1 downto 0 do begin if AnsiUpperCase(LISTE2[i])=AnsiUpperCase(Copy(LISTE1[j], 1, Length(LISTE2[i]))) then begin //schreibe zugehörigen WERT in andere Liste LISTE1.Delete(j); end; end; end; |
Re: Funktion schneller machen?
LISTE1 ist sortiert ?
Dann das Pferd andersrum aufzäumen. Gehe LISTE1 sequentiell durch. Solange der KEY identisch ist alle Werte in einem String extrahieren. Sobald der KEY sich ändert ordnest du nun den String mit den Werten des alten KEY in LISTE2 ein. So gehst du LISTE1 mit 10000 Werten nur einmalig durch und LISTE2 mit 700 Werten wird sortiert nach KEY sequentiell aufgebaut. Suchen erledigt sich. Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz