AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein wieder mal 2 Stringlisten vergleichen, Zugriff funzt net
Thema durchsuchen
Ansicht
Themen-Optionen

wieder mal 2 Stringlisten vergleichen, Zugriff funzt net

Ein Thema von BAMatze · begonnen am 2. Okt 2009 · letzter Beitrag vom 2. Okt 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

wieder mal 2 Stringlisten vergleichen, Zugriff funzt net

  Alt 2. Okt 2009, 10:22
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
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: wieder mal 2 Stringlisten vergleichen, Zugriff funzt net

  Alt 2. Okt 2009, 11:19
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.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: wieder mal 2 Stringlisten vergleichen, Zugriff funzt net

  Alt 2. Okt 2009, 11:29
Da könntest du Recht haben. werde das gleich Testen
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#4

Re: wieder mal 2 Stringlisten vergleichen, Zugriff funzt net

  Alt 2. Okt 2009, 12:12
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz