![]() |
mein Vergleichen von Strings --> Bewertung
Hallo DPler :hi:
Ich vergleiche die Einträge meiner Listbox mit einem text im Suchfeld. Jetzt würde ich gerne von euch wissen ob diese Lösung effektiv ist oder ob man es besser machen kann. :) Ach ja, das Ganze geschiet im OnChange des Edit-Feldes.
Delphi-Quellcode:
lsbSuche.Clear;
if length(edSuchen.Text)>= 1 then begin for i := 0 to lsbPlaylist.Count - 1 do if ansipos(ansilowercase(edSuchen.Text),ansilowercase(lsbPlaylist.Items.Strings[i])) = 1 then lsbSuche.Items.Add(lsbPlaylist.Items.Strings[i]) end; |
Re: mein Vergleichen von Strings --> Bewertung
Effizienz ist immer so eine Sache. Kann schon mit der Anzahl der Elemente variieren. Nimm z.B. Sortieralgorithmen, da ist der Mergesort asymptotisch auf jeden Fall schneller als ein Insertionsort, sortierst Du aber nur 3 Elemente wirst Du das kaum bestätigen (gut, hängt auch noch von der Implementierung ab).
So ist es auch hier, es kann für bestimmte Situationen auch sehr viel bessere Lösungen geben, z.B. einen Präfixbaum. Bei diesem könnte z.B. jeder Knoten je ein Kind für jeden Buchstaben beinhalten. Zudem kannst Du in jedem Knoten einen Verweis auf alle Strings speichern, die mit dem Präfix beginnen, dass sich aus eben diesen Buchstaben ergibt. Ist die Länge des Präfix, dass Du suchst << als die Anzahl der Elemente in lsbPlaylist, dann wird dieser Baum viel effizienter sein (und viel mehr Speicher benötigen). Gruß Der Unwissende |
Re: mein Vergleichen von Strings --> Bewertung
Ich durchsuche mit einer Ähnlichen Methode wie der von xX0815Xx eine Liste mit meistens über 10000 Einträgen. Ist das da auch effizient :stupid:
|
Re: mein Vergleichen von Strings --> Bewertung
Delphi-Quellcode:
:mrgreen:
lsbplaylist.ToLowercase;
idx := lsbplaylist.IndexOf(ansilowercase(edsuchen.text),0); while (idx > 0) do begin lsbSuche.Items.Add(lsbPlaylist.Items.Strings[i]); idx := lsbplaylist.IndexOf(ansilowercase(edsuchen.text),idx+1); end; |
Re: mein Vergleichen von Strings --> Bewertung
Was meinst Du mit 'effizient'? Aus ästhetischen Gesichtpunkten würde ich sagen, das 'Pos' zu mächtig ist. Du möchstest nur wissen, ob ein Text mit einem anderen Text beginnt, Pos sucht aber den ganzen String durch.
Zum Prüfen, ob S in T vorkommt, reicht es, S mit T zu vergleichen, und zwar die ersten length(S) Zeichen. Das geht mit CompareMem sehr gut. Hier mal eine Routine, die prüft ob ein String mit einem anderen anfängt. Sie ist doppelt so schnell wie Pos.
Delphi-Quellcode:
Gemessen habe ich den Mittelwert zwischen Pos('AAA','AAABBBBBBBB') und Pos('XXX','AAABBBBBBBB').
Function Beginswith(Const sSubStr, sString: String): Boolean;
Begin If Length(sString) = 0 Then Result := False Else If Length(sSubStr) > Length(sString) Then Result := False Else Result := CompareMem(@sSubstr[1], @sString[1], Length(sSubStr)) End; |
Re: mein Vergleichen von Strings --> Bewertung
Es soll schon der gesamte String verglichen werden, nicht nur der Anfang...
|
Re: mein Vergleichen von Strings --> Bewertung
Wird er ja auch
Pos ('AAA','AAABBBB') = 1 <==> Beginswith('AAA','AAABBBB') = True Du machst doch genau das. |
Re: mein Vergleichen von Strings --> Bewertung
Aber
Delphi-Quellcode:
Oder täusch ich mich da? Es soll ja alles durchsucht werden.
Pos('AAA','BBBAAA') = 1
beginswith('AAA','BBBAAA') = FALSE Nehmen wir mal an in der Playlist steht: Artist1 - Lied1 Artist1 - Lied2 Artist1 - Lied3 Jetzt suche ich "Lied1". Bei deiner Methode würde doch ein FALSE rauskommen, bei mir eine 1. |
Re: mein Vergleichen von Strings --> Bewertung
Zitat:
Zitat:
|
Re: mein Vergleichen von Strings --> Bewertung
Du schreibst
Delphi-Quellcode:
Nehmen wir den überflüssigen Schmoo weg, bleibt
if ansipos(ansilowercase(edSuchen.Text),ansilowercase(lsbPlaylist.Items.Strings[i])) = 1 then
Delphi-Quellcode:
Oder eben
if ansipos(edSuchen.Text,lsbPlaylist.Items.Strings[i]) = 1 then
Delphi-Quellcode:
"Wenn A in B an der 1.Stelle vorkommt, dann ...."
AnsiPos (A,B)=1
Zitat:
Ah.. Du willst nur sehen, ob 'Foo' in 'Mu Foo bar' vorkommt. Dafür nimmst du Pos und prüfst, ob das Ergebnis <>0 ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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