Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mein Vergleichen von Strings --> Bewertung (https://www.delphipraxis.net/104584-mein-vergleichen-von-strings-bewertung.html)

Aurelius 6. Dez 2007 20:17


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;

Der_Unwissende 6. Dez 2007 20:45

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

argonix 6. Dez 2007 21:22

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:

Ghostwalker 7. Dez 2007 04:22

Re: mein Vergleichen von Strings --> Bewertung
 
Delphi-Quellcode:
    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;
:mrgreen:

alzaimar 7. Dez 2007 09:07

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:
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;
Gemessen habe ich den Mittelwert zwischen Pos('AAA','AAABBBBBBBB') und Pos('XXX','AAABBBBBBBB').

Aurelius 7. Dez 2007 09:29

Re: mein Vergleichen von Strings --> Bewertung
 
Es soll schon der gesamte String verglichen werden, nicht nur der Anfang...

alzaimar 7. Dez 2007 09:32

Re: mein Vergleichen von Strings --> Bewertung
 
Wird er ja auch

Pos ('AAA','AAABBBB') = 1 <==> Beginswith('AAA','AAABBBB') = True

Du machst doch genau das.

Aurelius 7. Dez 2007 09:43

Re: mein Vergleichen von Strings --> Bewertung
 
Aber
Delphi-Quellcode:
Pos('AAA','BBBAAA') = 1
beginswith('AAA','BBBAAA') = FALSE
Oder täusch ich mich da? Es soll ja alles durchsucht werden.

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.

sirius 7. Dez 2007 09:47

Re: mein Vergleichen von Strings --> Bewertung
 
Zitat:

Zitat von xX0815Xx
Oder täusch ich mich da?

Ja.
Zitat:

Wird der Teil-String gefunden, gibt Pos den Integer-Index des ersten Zeichens von Substr in S zurück. Die Groß/Kleinschreibung wird von Pos nicht berücksichtigt. Ist Substr nicht vorhanden, wird der Wert Null zurückgegeben.

alzaimar 7. Dez 2007 09:51

Re: mein Vergleichen von Strings --> Bewertung
 
Du schreibst
Delphi-Quellcode:
if ansipos(ansilowercase(edSuchen.Text),ansilowercase(lsbPlaylist.Items.Strings[i])) = 1 then
Nehmen wir den überflüssigen Schmoo weg, bleibt
Delphi-Quellcode:
if ansipos(edSuchen.Text,lsbPlaylist.Items.Strings[i]) = 1 then
Oder eben
Delphi-Quellcode:
AnsiPos (A,B)=1
"Wenn A in B an der 1.Stelle vorkommt, dann ...."

Zitat:

Zitat von xX0815Xx
Aber
Delphi-Quellcode:
Pos('AAA','BBBAAA') = 1

Stimmt nicht, da kommt '4' raus.

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.
Seite 1 von 2  1 2      

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