![]() |
wieder mal 2 Stringlisten vergleichen, Zugriff funzt net
Hallo und guten Tag an alle DP´ler,
Habe ein Problem das hier zwar schon öfter besprochen wurde, aber leider klappt dort ein Zugriff nicht. Also folgende Situation: Ich habe 2 Stringlisten und möchte überprüfen, welche der Elemente in beiden und welche in nur einer der beiden Listen stehen. Habe dafür NICHT den häufig benutzen (folgenden) Algorithmus genutzt, den ich hier häufiger gefunden hab:
Delphi-Quellcode:
Sondern da ich lediglich Integer Werte in meinen Listen hab, füge ich die Listen in eine temporären Liste zusammen und soriere sie. Das bedeutet gleiche Zahlen stehen somit immer hinter einander. Ich fange dann vorne an und schaue, ob der i.te- und der i.te+1-Wert gleich sind. Wenn das der Fall ist, lösche ich diese und führe an der selben Stelle danach meine Überprüfung nochmal durch, wenn die nicht gleich sind, erhöhe ich i. Das funzt auch gut, hab dann eine List, mit in der ich nur die Elemente gefunden habe die nicht in beiden Listen vorkommen. Jetzt möchte ich diese nur noch kennzeichnen, aus welcher Liste sie kommen. Die Elemente aus der einen Liste sollen ein "-" vorgestellt bekommen, die anderen nicht, also prüfe ich einfach jedes noch Verbleibende Element der temporären Liste mit einer der beiden Listen, kommt der Wert in der Liste vor, kommt der Wert augenscheinlich aus dieser Liste und soll nicht gekennzeichnet werden, kommt er nicht vor, soll er das "-" vorgestellt bekommen. Hier liegt jetzt das Problem, denn er macht das nicht.
Var
A, B:Integer; begin For A := 0 To Memo2.Lines.Count-1 do begin For B := 0 To Memo1.Lines.Count -1 do If Memo1.Lines[B] = Memo2.Lines[A] Then begin Memo3.Lines.Add(Memo2.Lines[A]); end; end; end; Hier der Algorithmus dafür (in diesem habe ich das vor setzen des "-" erzwingen wollen und hab deswegen in der gekennzeichneten else-Anweisung allen ein "-" vorgesetzt - Werte bleiben trozdem positiv)
Delphi-Quellcode:
Was ist an der Zuweisung des eigentlichen Strings dort falsch? Eigentlich kann das ja nicht so schwer sein, aber ich sehe gerade gar keinen Fehler. In einem Memo, wo die Werte des sLTempList angezeigt werden, kann ich nur sehen, dass die entsprechenden Werte alle positiv bleiben.
sLTempList := TStringList.Create;
ComBuffer := TComport.Create; result := false; try sLTempList.Assign(List); // die erste Liste in die temporäre Liste aufnehmen List.Clear; for i := 0 to ComBuffer.Anzahl - 1 do begin List.Add(inttostr(ComBuffer.Comportnummer[i])); sLTempList.Add(inttostr(ComBuffer.Comportnummer[i])); // die Werte der 2.Liste ergänzen end; sLTempList.Sort; // sortieren i := 0; repeat if i+1 <= sLTempList.Count - 1 then begin if sLTempList[i] = sLTempList[i+1] then // Überprüfen, ob i und i+1 Wert gleich sind begin sLTempList.Delete(i+1); //beide Löschen sLTempList.Delete(i); //beide Löschen end else // die else-Anweisung darf nicht gelöscht werden, sonst startet das Programm nicht begin {for j := 0 to List.Count - 1 do {if sLTempList[i] = List[j] then // Hier soll irgendwann mal die Entscheidung folgen, ob Wert gekennzeichnet wird oder nicht else sLTempList[i] := '-' + sLTempList[i]; }//ist noch falsch!! sLTempList[0] := '-' + sLTemplist[0]; //Erzwungene Kennzeichnung, die nicht funktioniert!!! i := i+1; end; end; until ((i+1) > (sLTempList.Count - 1)); iAnzahl := sLTempList.Count; result := true; finally doComportChange(sLTempList, List); ComBuffer.Free; sLTempList.Free; end; Vielen Dank im Voraus BAMatze [Edit] 1. Algorithmus ergänzt (hatte ich vergessen)[/Edit] |
Re: wieder mal 2 Stringlisten vergleichen, Zugriff funzt net
Also ich habe da jetzt beim drüber gucken, keinen Fehler entdecken können. Aber ersteinmal würde ich aus der repeat-until-Schleife eine while-do-Schleife machen, dann solltest du dir diese if-Abfrage nach dem repeat sparen können und dann würde ich das ganze mal debuggen, ob er überhaupt in den Zweig kommt, wo deine "erzwungene Zuweisung" ist. Denn ich denke ehr, dass es an der if-Verzweigung als an dem Zugriff auf die Elemente in der Stringliste liegt.
|
Re: wieder mal 2 Stringlisten vergleichen, Zugriff funzt net
Da könntest du Recht haben. werde das gleich Testen
|
Re: wieder mal 2 Stringlisten vergleichen, Zugriff funzt net
Ginge das nicht auch so?
Delphi-Quellcode:
procedure FilterStrings(const List1, List2, DestList: TStrings);
var I, found: Integer; tempList: TStringlist; begin DestList.BeginUpdate; try DestList.Clear; //Falls die ursprünglichen Listen erhalten bleiben sollen tempList := TStringlist.Create; try tempList.AddStrings(List2); //erste Liste durchgehen for I := 0 to List1.Count - 1 do begin found := tempList.IndexOf(List1[i]); //keine Entsprechung gefunden -> in Ergebnis eintragen if found < 0 then DestList.Add(Format('1 -> %s',[List1[i]])) //Entsprechung aus temp. Liste löschen else tempList.Delete(found); end; //temp. Liste sollte nun keine Entsprechungen mehr aufweisen, //also verbleibende Strings eintragen for I := 0 to tempList.Count - 1 do DestList.Add(Format('2 -> %s',[tempList[i]])) finally tempList.Free; end; finally DestList.EndUpdate; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 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