Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   wieder mal 2 Stringlisten vergleichen, Zugriff funzt net (https://www.delphipraxis.net/141093-wieder-mal-2-stringlisten-vergleichen-zugriff-funzt-net.html)

BAMatze 2. Okt 2009 09:22


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:
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]

hugo1990 2. Okt 2009 10:19

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.

BAMatze 2. Okt 2009 10:29

Re: wieder mal 2 Stringlisten vergleichen, Zugriff funzt net
 
Da könntest du Recht haben. werde das gleich Testen

DeddyH 2. Okt 2009 11:12

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