AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zwei Stringlisten miteinander vergleichen. Wie am besten ?
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Stringlisten miteinander vergleichen. Wie am besten ?

Ein Thema von HolgerCW · begonnen am 21. Nov 2008 · letzter Beitrag vom 21. Nov 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#11

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:05
Meine Idee:

Klar, erst den Count.

Um das IndexOf von DeddyH hinten raus schneller zu machen: Kopie von der ersten Liste anlegen.

Durch die zweite Liste einmal durchiterieren, und jeden gefunden Eintrag in der zweiten Liste aus der Kopie der Ersten entfernen.
Prinzip:
Code:
for i:=0 to Liste2.Count -1 do
  Kopie.Remove( Kopie.IndexOf( Liste2.[i]));
Findest Du einen Eintrag nicht, kannst Du sofort abbrechen. Und durch das Entfernen aus der Kopie musst Du bereits gefundene Einträge auch nicht erneut anschauen -> IndexOf hat mit jedem Durchlauf weniger Elemente zu prüfen.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.993 Beiträge
 
Delphi 7 Professional
 
#12

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:09
Interessante Idee!

Zwischenfrage: Kenne "Remove" nicht

Ist das eine Methode, die nach D7 eingeführt wurde?
Warum nicht Delete()?
Oder ist das ein Schreibfehler?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:10
Remove ist AFAIK eine Methode von TList. Delete sollte aber genauso gehen.
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
nahpets
(Gast)

n/a Beiträge
 
#14

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:12
Zitat von DeddyH:
Oder erst die Anzahl der jeweils enthaltenen Strings ermitteln und dann in einer Schleife mit IndexOf() vergleichen. Dies dürfte aber nicht die schnellste Methode sein.

[edit]
Zitat von naphets:
Was ist, wenn die Zahl der Zeilen übereinstimmt, aber nicht Length(sl1.Text) und Length(sl2.Text)?
In dem Fall erübrigt sich ein weiterer Vergleich, oder? Ich war davon ausgegangen, dass das bereits abgeprüft wurde. [/edit]
Wenn nach 'nem Sort sl1.Text und sl2.Text ungleich sind, dann könnte IndexOf schnell sein, wenn man beim ersten Unterschied aussteigt, man müsste sonst ja in 'ner Schleife die an gleicher Position miteinander vergleichen, ob das schneller ist, müsste man mal testen. Aber da stellt sich dann die Frage, wieviel Aufwand darf oder muss man Treiben. Listen mit 10 Einträgen oder Listen mit 10.000.000 Einträgen?

Remove heißt Delete. Hatte ich sowas nicht oben schon mal beschrieben?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:15
Ich bin gerade nicht unter Windows unterwegs und kann daher nicht nachsehen, aber AFAIR ist der Unterschied zwischen Remove und Delete der Rückgabewert (Index bzw. Inhalt). Ich kann mich da aber auch irren.
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
HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#16

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:21
Hi.

So sieht es nun bei mir aus:

Delphi-Quellcode:
function ...
begin
 
 Result := FALSE;

 TStringList(aktuelle_StringList).Sorted := true;
 TStringList(alte_StringList).Sorted := true;

 if alte_StringList.Count <> aktuelle_StringList.Count then
 begin

  //Result := CompareMem(PChar(alte_StringList.Text),PChar(aktuelle_StringList.Text),Length(alte_StringList.Text));

  for I := 0 to aktuelle_StringList.Count -1 do
   alte_StringList.Delete(alte_StringList.IndexOf(aktuelle_StringList[i]));

 end else
 begin

  Result := FALSE;

 end;

 alte_StringList.Assign(aktuelle_StringList);
 aktuelle_StringList.Free;

end;
Wie springe ich dort nun beim nicht finden raus oder breche ab ?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#17

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:24
Deswegen hab ich "Prinzip" geschrieben und das Teil in Code- und nicht Delphi-Tags gesetzt
In der .NET Welt heisst das Ding auf Listen eben Remove, und ich bin zur Zeit meist im .NET Umfeld unterwegs *g*
Zumal ich da eh nicht for i.. sondern eine for-in-Schleife nehmen würde
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#18

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:51
Wie springe ich dort nun beim nicht finden raus oder breche ab ?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#19

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 11:55
In etwa so:
Delphi-Quellcode:
var
  foundIndex: integer;
begin
// ...
result := false;

if alte_StringList.Count <> aktuelle_StringList.Count then
begin

  for I := 0 to aktuelle_StringList.Count -1 do
  begin
    foundIndex := alte_StringList.IndexOf(aktuelle_StringList[i]);
    if foundIndex < 0 then
      exit;
    alte_StringList.Delete(foundIndex);
  end;
  
  // alles gefunden?
  result := alte_StringList.Count = 0;

end;
//...
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#20

Re: Zwei Stringlisten miteinander vergleichen. Wie am besten

  Alt 21. Nov 2008, 12:30
Hallo,
Delphi-Quellcode:
function ...
Var
      iIndex : Integer;
begin
  Result := true;
  // Gleiche Zeilenzahl ist nicht zwingend gleichbedeutend mit gleichem Inhalt!!!
  if alte_StringList.Count <> aktuelle_StringList.Count then begin
    if alte_StringList.Text <> aktuelle_StringList.Text then begin

      // Ist aktuelle_StringList keine Stringliste?
      // warum der Cast?
      // TStringList(aktuelle_StringList).Sorted := true;
      // TStringList(alte_StringList).Sorted := true;
 
      aktuelle_StringList.Sort;
      alte_StringList.Sort;

      // Hier wird geprüft, ob alles aus Aktuelle auch in Alte ist.
      // Es wird nicht geprüft, was in Alte ist, aber nicht in Aktuelle.
      for I := 0 to aktuelle_StringList.Count -1 do begin
        // Wenn nicht gefunden ist IndexOf = -1, gibt einen Fehler, wenn er im Delete steht.
        iIndex := alte_StringList.IndexOf(aktuelle_StringList[i]);
        if iIndex > -1 then alte_StringList.Delete(i)
        else begin // ein Unterschied gefunden
          Result := False;
          break;
        end;
      end;
      // Ist Alte hier nicht leer, dann gibt es in Alte etwas, was nicht in Aktuelle enthalten ist.
      if not Result and (alte_StringList.Count <> 0) do begin
        Result := False;
      end;
      alte_StringList.Assign(aktuelle_StringList);
    end;
  end;
  aktuelle_StringList.Free;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 07:26 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