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:
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;
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.
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:
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;
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.
Vielen Dank im Voraus
BAMatze
[Edit] 1. Algorithmus ergänzt (hatte ich vergessen)[/Edit]
2. Account Sero