![]() |
Delphi-Version: XE2
String in TObjectList suchen
Guten Morgen z'sammen,
ich arbeite und lerne zur Zeit mit Delphi. Bei allen bis heute auftretenden Problemen, hat mir diese Community super geholfen und ich konnte meine Fehler immer finden und beseitigen, doch heute bräuchte ich mal Hilfe. Dazu schildere ich am besten mal mein Problem so gut wie es geht: Ich habe ein Memofeld in den ich Text schreibe. Die einzelnen Wörter werden ausgelesen und in einen String geschrieben - natürlich nicht alle auf einmal. Sobald also ein vollständiges Wort in meinem String ist, soll in meiner TObjectList gesucht werden, ob es bereits vorhanden ist und wenn es das nicht ist, soll es mit einem Counter hinzugefügt werden. Es scheitert bei mir nicht an dem Hinzufügen, sondern an dem Abgleich, weil ich dort eine OutOfRange-Exception bekomme und ich mit den Lösungen im Internet nicht wirklich viel anfangen konnte. Ich schicke euch mal meinen jämmerlichen Ansatz, wie ich versuche den Abgleich zu machen. <embarassed>
Code:
__________________________________________________ __________________________________________________ _______________________________________________
repeat
if TCharacter.isletter(sEingabe[iIndex]) then // Solange das aktuelle Zeichen begin // ein Buchstabe ist, sWort := (AnsiLowerCase(sWort) + sEingabe[iIndex]); // soll dieser zu sWort gefügt werden. end else begin iCounter := 0; if sWort <> '' then // Wenn es ein anderes Zeichen ist begin if List.Count = 0 then begin iAnzahl := 1; List.Add(TWort.create(AnsiLowerCase(sWort), iAnzahl)); // Sobald es ein anderes Zeichen ist, soll sWort der TObjectList hinzugefügt werden // Erhöht die Häufigkeit um einen sWort := ''; end else begin repeat if sWort = List[iCounter].sWort2 then <--------------- Hier meckert er! begin List[iCounter].iAnzahl := List[iCounter].iAnzahl + 1; // Erhöht die Häufigkeit um einen sWort := ''; iCounter := List.Count - 1; end else begin if List[List.Count - 1].sWort2 = '' then begin break; end else inc(iCounter); end; until iCounter = List.Count - 1; end; if sWort <> '' then begin iAnzahl := 1; List.Add(TWort.create(AnsiLowerCase(sWort), iAnzahl)); // Sobald es ein anderes Zeichen ist, soll sWort der TObjectList hinzugefügt werden // Erhöht die Häufigkeit um einen sWort := ''; end; end; end; inc(iIndex); until iIndex = Length(sEingabe) + 2; (Verzeiht mir, wenn ich nicht die richtige Implementation gewählt habe, mein Browser spinnt gerade irgendwie. Ich kann nichtmals Smileys setzen...) Also zur Erklärung: Der Obere Teil ist ja einfach nur das Auslesen und gucken, ob es ein Buchstabe ist oder nicht. Danach soll er dann, weil ja zu Beginn noch kein Element in der List ist, das erste Wort ohne Abgleich reinschreiben. Sobald List.Count aber nicht mehr 0 ist, also ein Element vorhanden ist, soll er den neuen String mit den Elementen in der Liste vergleichen und bei einem Fund den Zähler für dieses Wort erhöhen. Und wenn das Wort halt nicht drin ist, dann soll er es ganz normal hinzufügen - so weit der Plan. Ich hoffe ich konnte das gut genug schildern und bedanke mich schonmal für eure Hilfe. Gruß Jan |
AW: String in TObjectList suchen
Der Index wird bei 0 beginne, dann ist der höchste Index Count-1
|
AW: String in TObjectList suchen
Hallo mkinzler,
das fiel mir beim durchlesen auch ebengerade auf, ich hatte die -1 da eigentlich schon drin stehen, war jetzt selbst verwirrt... Fehler gelangt nämlich jetzt an seine alte Position in die Zeile: if sWort = List[iCounter].sWort2 then Gruß Jan |
AW: String in TObjectList suchen
Hier Nicht:
Zitat:
|
AW: String in TObjectList suchen
Wie meinst du "Hier Nicht"? Das ist doch die einzige Stelle, wo es hingehören würde. Mir ist klar, dass die Indexposition bei 0 beginnt, aber außer dieser einen Zeile gäbe es doch sonst keine Möglichkeit.
|
AW: String in TObjectList suchen
List.count ist zb. 3
Der Index ist aber dann von 0..2. Daher ist List.count ein Index den es nicht gibt. Grüße Klaus |
AW: String in TObjectList suchen
Ich muss das glaube ich mal richtig verstehen...
Ich habe eine Liste mit 10 Elementen. Die geht dann von 0 bis 9. Jetzt schreibe ich einen String mit seinem dazugehörigen Integerwert an die erste Stelle, also die 0te. Wenn ich jetzt ein weiteres Element habe, dann soll er das, mit allen Indexpositionen vergleichen, ob der String schon vorhanden ist. Das wollte ich mit iCounter machen, der bei 0 startet und dann sich erhöht bis zu List.Count - 1, also dem höchsten Listenindex. Aber habe ich deinen Fall nicht schon mit der -1 abgedeckt Klaus? |
AW: String in TObjectList suchen
Wäre es nicht einfacher, die Suche in eine eigene Methode auszulagern? Dazu könnte man entweder die Liste erweitern, oder man macht es zur Not von außen.
Delphi-Quellcode:
Gibt diese Funktion -1 zurück, ist das Wort nicht enthalten.
function TWasWeißIch.IndexOfToken(const Token: string): integer;
var idx: integer; begin Result := -1; for idx := 0 to List.Count - 1 do if Token = List[idx].sWort2 then begin Result := idx; break; end; end; |
AW: String in TObjectList suchen
Zitat:
|
AW: String in TObjectList suchen
@mkinzler: Das hatte ich ja verbessert, s. #3
@DeddyH: Ich habe daraus zwar keine eigene Funktion gemacht, aber ich habe das Problem mit einer For-Schleife lösen können. Danke dafür. Er geht das jetzt auch alles richtig durch, doch jetzt wirft er mir während ich das eben gedebuggt habe eine Exception bei meinem Sortieralgorithmus aus...
Code:
Dies ist ebenfalls wieder eine OutOfRange-Exception, aber die verstehe ich nicht so ganz. iHcounter soll eine andere Indexposition haben als iPosition. Ich muss ja schließlich irgendwie die Zahlen zu den Strings sortieren und damit einhergehend vollständige Elemente der TObjectList, oder ist das falsch?
procedure TForm1.Sort(var List: TObjectList<TWort>);
var iCounter, iHcounter, iPosition: integer; Temp: TWort; begin iHcounter := 0; iCounter := 0; while iCounter < High(List[List.Count - 1].iAnzahl) do begin iPosition := iCounter; if iHcounter = High(List[List.Count - 1].iAnzahl) + 1 then begin inc(iCounter); iHcounter := iCounter; end else begin for iHcounter := iCounter + 1 to High(List[List.Count - 1].iAnzahl) do begin if (List[iHcounter].iAnzahl) > (List[iPosition].iAnzahl) then <----------- Siehe hier. // Sortiert die TObjectList nach der Häufigkeit begin Temp := List[iHcounter]; List[iHcounter] := List[iPosition]; List[iPosition] := Temp; end; end; iHcounter := 0; end; end; end; @Edit: Ich verlange nicht, dass ihr mir den kompletten Code vorschreibt, so lerne ich schließlich nicht... Ich brauche nur das Verständnis. Danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 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