![]() |
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
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:
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.
for i:=0 to Liste2.Count -1 do
Kopie.Remove( Kopie.IndexOf( Liste2.[i])); |
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
Interessante Idee!
Zwischenfrage: Kenne "Remove" nicht :roll: Ist das eine Methode, die nach D7 eingeführt wurde? Warum nicht Delete()? Oder ist das ein Schreibfehler? |
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
Remove ist AFAIK eine Methode von TList. Delete sollte aber genauso gehen.
|
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
Zitat:
Remove heißt Delete. Hatte ich sowas nicht oben schon mal beschrieben? :wink: |
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
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.
|
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
Hi.
So sieht es nun bei mir aus:
Delphi-Quellcode:
Wie springe ich dort nun beim nicht finden raus oder breche ab ?
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; |
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
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 ;-) |
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
Wie springe ich dort nun beim nicht finden raus oder breche ab ?
|
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
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; //... |
Re: Zwei Stringlisten miteinander vergleichen. Wie am besten
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 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