![]() |
problem mit Stringlist, test auf vorhandensein einer phrase?
moin leute,
ich verstehe einfach nicht warum ich bei dieser codezeile eine exeption bekomme. entweder ich mach einen denkfehler, oder es is zu spaet.
Delphi-Quellcode:
mhhh, der compiler meint noch das mose eventuell nicht initialisiert wurde. weis aber nicht was er damit meint.var mose: Tstringlist; bla:string; ... begin bla:='irgendwas'; if mose.IndexOf(bla) = -1 then mose.Add(bla); //wenn string der Variablen bla nicht in mose zu finden ist, so fuege trage es in die stringlist ein end; vielleicht weis ja einer wo der fehler steckt. schonmal danke fuer eure muehen. Gruß Richard |
Re: problem mit Stringlist, test auf vorhandensein einer phr
Delphi-Quellcode:
Mose := TStringList.Create;
|
Re: problem mit Stringlist, test auf vorhandensein einer phr
oh mann ne echt, das war es.
sollte wohl wirklich schlafen gehn. danke dir vielmals gruß richard |
Re: problem mit Stringlist, test auf vorhandensein einer phr
dass so eine überprüfung bei einer neu createten (also absolut leeren) Stringlist niucht besonders sinnvoll ist, weißt du aber, oder? ;()
|
Re: problem mit Stringlist, test auf vorhandensein einer phr
mhh nein, wenn du weist wie es schneller und besser geht, erklaer es mir doch bitte? :)
Gruß Richard ;) |
Re: problem mit Stringlist, test auf vorhandensein einer phr
Hallo Richard,
was Lukas dir eigentlich mitteilen wollte: eine leere Stringliste kann das gesuchte Elemente gar nicht enthalten. :wink: Er ging aber wohl davon aus, daß die Stringliste unmittelbar vor der Überprüfung erzeugt wird. Du könntest dir mal die Eigenschaft ![]() Gruß Hawkeye |
Re: problem mit Stringlist, test auf vorhandensein einer phr
Hallo Richard,
wenn die StringList keine doppelten Einträge aufnehmen darf und die assoziierten Objects nicht verwendet werden, dann ist es tatsächlich sinnvoll die Liste als sortierte Liste mit Duplikatabweisung zu führen:
Delphi-Quellcode:
Grüße vom marabu
begin
with TStringList.Create do begin; Sorted := true; Duplicates := dupIgnore; Add('Hawkeye'); Add('Hawkeye'); ShowMessage(StrToInt(Count)); Free; end; end; |
Re: problem mit Stringlist, test auf vorhandensein einer phr
@marabu
ist dein code denn schneller? ist doch eigentlich mehr code? mein code steht in einer procedure die vielfach aufgerufen wird. kann dabei vorkommen das häufig der selbe string uebergeben wird, der jedoch nicht erwuenscht ist. es sollen nur unterschiedliche strings in die liste. liste.count dient mir dann als zaehler. ich frage welcher code schneller ist, da ja das durchsuchen der stringlist mit jeden eintrag laenger dauert, und die procedure mehrere tausend mal aufgerufen wird. momentan denke ich mein version muesste schneller sein, da bei mir nur ein eintrag hinzugefuegt wird, wennn es wirklich nicht vorhanden ist. bei deiner version tust du aber bei jeden aufruf stringlist.add ausfuehren oder? Gruß richard |
Re: problem mit Stringlist, test auf vorhandensein einer phr
Die Suche ist das teuerste an der Sache. Die Kosten reduziere ich durch Sorted = True wodurch die lineare Suche durch einen binary search ersetzt wird. Und durch die Ausnutzung von Duplicates = dupIgnore kann ich die lines-of-code drücken - weniger Code, weniger Fehler, happy people.
Wenn du was sparen willst, dann müsstest du bei einer sortierten Liste Find() anstelle von IndexOf() verwenden, damit der gefundene insertion point nicht verloren geht - aber dann kannst du auch schon Add() nehmen, weil es genauso arbeitet. marabu |
Re: problem mit Stringlist, test auf vorhandensein einer phr
@marabu du verstehst nich. der gefundene insertion punkt ist voellig unwichtig fuer mich. nur der test auf bereits vorhanden / nicht vorhanden ist von bedeutung. geht die suche den tatsaechlich schneller mit deinem code? bitte nur eine ja / nein antwort ;)
eigentlich missbrauche ich die stringlist in dem fall nur als array ersatz, da ich irgendwo mal gehoert habe das Tstringlist viel schneller sein soll. Gruß Richard :D |
Re: problem mit Stringlist, test auf vorhandensein einer phr
Zitat:
Delphi-Quellcode:
marabu
const
IMAX = 10000; procedure TDemoForm.MarabuClick(Sender: TObject); var i: Integer; s: String; tc: Cardinal; sl: TStringList; begin sl := TSTringList.Create; sl.Sorted := true; sl.Duplicates := dupIgnore; tc := GetTickCount; for i := 1 to IMAX do begin s := RandomStr(3); sl.Add(s); end; tc := GetTickCount - tc; ShowMessage(Format('%d dupes, %d ticks', [IMAX - sl.Count, tc])); sl.Free; end; procedure TDemoForm.RichardClick(Sender: TObject); var i: Integer; s: String; tc: Cardinal; sl: TStringList; begin sl := TSTringList.Create; sl.Sorted := true; tc := GetTickCount; for i := 1 to IMAX do begin s := RandomStr(3); if sl.IndexOf(s) = -1 then sl.Add(s); end; tc := GetTickCount - tc; ShowMessage(Format('%d dupes, %d ticks', [IMAX - sl.Count, tc])); sl.Free; end; |
Re: problem mit Stringlist, test auf vorhandensein einer phr
Wo ist RandomStr deklariert? Ich finde das in meiner OH nicht.
|
Re: problem mit Stringlist, test auf vorhandensein einer phr
Das nenne ich einen aufmerksamen Leser. Hier hast du:
Delphi-Quellcode:
marabu
function RandomStr(size: integer): string;
var i: integer; begin SetLength(Result, size); for i := 1 to Length(Result) do Result[i] := Chr(Ord('A') + Random(26)); end; |
Re: problem mit Stringlist, test auf vorhandensein einer phr
Zitat:
Danke ;) |
Re: problem mit Stringlist, test auf vorhandensein einer phr
@marabu
*zitat* bitte nur eine ja / nein antwort *zitat ende* beachte bitte den smiley dahinter gg danke dir fuer deine ausfuehrungen. dein besipiel werd ich mal genau unter die lupe nehmen. gruß richard :D //edit warum willst du die liste eigentlich unbedingt sortieren? wobei mir auffaellt das deine RandomStr routine, wesentlich mehr unterschiedliche strings liefert als gleiche |
Re: problem mit Stringlist, test auf vorhandensein einer phr
Hallo Richard.
Zitat:
Zitat:
Zitat:
marabu |
Re: problem mit Stringlist, test auf vorhandensein einer phr
ok marabu,
du hast mich ueberzeugt. hab mir grad deinen code angeschaut und ausprobiert. ich versteh zwar nich genau was binaery suche bedeutet und warum es schneller ist, aber egal. die zahlen luegen ja nich. danke dir nochmal fuer deine hilfe :) gruß richard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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 by Thomas Breitkreuz