Delphi-PRAXiS

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.

Aurelius 7. Dez 2007 10:00

Re: mein Vergleichen von Strings --> Bewertung
 
Ah so, jetzt ist mir alles klar :wall: da hab ich die Hilfe falsch verstanden (steht aber auch eindeutig da).

Thx für eure Hilfe :thumb:

BullsEye 10. Dez 2007 18:48

Re: mein Vergleichen von Strings --> Bewertung
 
Wollte ich dir noch sagen. ich hab einige ungeordnete Titel und da heißt denn schonma so:
hallo_welt
der findet das dann aber nur bei der eingabe von hallo
gebe ich aber welt ein dann findet der dies nicht.

SirThornberry 10. Dez 2007 19:46

Re: mein Vergleichen von Strings --> Bewertung
 
wenn es um Geschwindigkeit geht würde ich ein BeginUpdate und ein EndUpdate noch mit unterbringen.

alzaimar 10. Dez 2007 21:47

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

Zitat von BullsEye
der findet das dann aber nur bei der eingabe von hallo
gebe ich aber welt ein dann findet der dies nicht.

Delphi-Quellcode:
Function IndexOfSubString(Const aSearchStr : String; aList : TStrings) : Integer;
Begin
  For Result := 0 To aList.Count - 1 Do
    If Post (aSearchStr, aList[i])<>0 Then Exit;
  Result := -1
End;

grenzgaenger 10. Dez 2007 23:06

Re: mein Vergleichen von Strings --> Bewertung
 
gibt aber nur den ersten gefundenen eintrag zurück ;-)

alzaimar 11. Dez 2007 06:26

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

Zitat von grenzgaenger
gibt aber nur den ersten gefundenen eintrag zurück ;-)

Wär' mir nicht aufgefallen :zwinker: Und wenn Du genau gelesen hättest, war mein Codeschnippsel die Antwort auf das Problem, das BullsEye das 'Welt' nicht findet, da er die Pos-Funktion noch nicht verinnerlicht hat.

Außerdem sind wir kein 'Ich-produzier-fertigen-Code-Forum', sondern ein 'Ich-geb-dir-n-Tipp-und-dann-schaffste-das-Forum', oder?

Und last, but not least: Anstatt das zu bemerken, hättest Du ja auch eine 'verbesserte' Version einstellen können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 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