AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi mein Vergleichen von Strings --> Bewertung
Thema durchsuchen
Ansicht
Themen-Optionen

mein Vergleichen von Strings --> Bewertung

Ein Thema von Aurelius · begonnen am 6. Dez 2007 · letzter Beitrag vom 11. Dez 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#1

mein Vergleichen von Strings --> Bewertung

  Alt 6. Dez 2007, 20:17
Hallo DPler

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;
Jonas
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: mein Vergleichen von Strings --> Bewertung

  Alt 6. Dez 2007, 20:45
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
  Mit Zitat antworten Zitat
Benutzerbild von argonix
argonix

Registriert seit: 28. Feb 2007
257 Beiträge
 
Delphi 2005 Personal
 
#3

Re: mein Vergleichen von Strings --> Bewertung

  Alt 6. Dez 2007, 21:22
Ich durchsuche mit einer Ähnlichen Methode wie der von xX0815Xx eine Liste mit meistens über 10000 Einträgen. Ist das da auch effizient
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: mein Vergleichen von Strings --> Bewertung

  Alt 7. Dez 2007, 04:22
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;
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: mein Vergleichen von Strings --> Bewertung

  Alt 7. Dez 2007, 09:07
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').
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#6

Re: mein Vergleichen von Strings --> Bewertung

  Alt 7. Dez 2007, 09:29
Es soll schon der gesamte String verglichen werden, nicht nur der Anfang...
Jonas
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: mein Vergleichen von Strings --> Bewertung

  Alt 7. Dez 2007, 09:32
Wird er ja auch

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

Du machst doch genau das.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#8

Re: mein Vergleichen von Strings --> Bewertung

  Alt 7. Dez 2007, 09:43
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.
Jonas
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: mein Vergleichen von Strings --> Bewertung

  Alt 7. Dez 2007, 09:47
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: mein Vergleichen von Strings --> Bewertung

  Alt 7. Dez 2007, 09:51
Du schreibstif ansipos(ansilowercase(edSuchen.Text),ansilowercase(lsbPlaylist.Items.Strings[i])) = 1 then Nehmen wir den überflüssigen Schmoo weg, bleibtif ansipos(edSuchen.Text,lsbPlaylist.Items.Strings[i]) = 1 then Oder eben
AnsiPos (A,B)=1 "Wenn A in B an der 1.Stelle vorkommt, dann ...."

Zitat von xX0815Xx:
Aber
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz