![]() |
Stringlist dupOnly
Hallo,
Ich habe einige Einträge in einer sortierten Stringlist und würde nun gerne alle Einträge, die nicht doppelt vorhanden sind entfernen. Hat jemand vielleicht eine Idee, wie man das am schnellsten machen kann. MFG |
Re: Stringlist dupOnly
die Liste sortieren und dann in einer schleife durchgehen und schauen ob der Nachfolger den gleichen Wert hat wie der Vorgänger
Delphi-Quellcode:
begin
[...] lNumFound := 0; lLastChecked := Liste.Strings[Liste.Count - 1]; for i := Liste.Count - 1 downto 0 do begin if Liste.Strings[i] = LastChecked then NumFound := NumFound + 1 else begin if (lNumFound > 1) then MehrfachVorhanden.Add(LastChecked); lNumFound := 1; LastChecked := 1; end; end; [...] |
Re: Stringlist dupOnly
Hallo Jens,
ich würde die List (Idice 0 .. n) in den Grenzen 1 bis n-1 einmal durchlaufen und jedes Element, welches keinen identischen Vorgänger oder keinen identischen Nachfolger hat aus der Liste löschen. Damit sind nur noch Elemente vorhanden, die mindestens 2x in der Liste enthalten sind. Gruß |
Re: Stringlist dupOnly
Zitat:
Hast du dafür vielleicht ein Beispiel, ich bekomme immer eine Exception (Listenindex überschreitet das Maximum). |
Re: Stringlist dupOnly
Habe hier im Büro kein Delphi zur Verfügung, insofern nur so "aus dem Kopf heraus"...
Delphi-Quellcode:
procedure DeleteSingleItems(var List:TStringList);
var Idx : Integer; begin Idx:=1; while Idx<List.Count-2 do if (List[Idx-1]<>List[Idx]) and (List[Idx+1]<>List[Idx]) then List.Delete(Idx) else inc(Idx); end; |
Re: Stringlist dupOnly
Zitat:
|
Re: Stringlist dupOnly
Hallo xtZ, jooo, das ist so eine Sache mit der virtuellen Programmierung im Büro zwischen zwei Besprechungen. Sorry, das war dann wohl doch etwas "zu schnell geschossen". Aber vielleicht hilft es ja doch ein wenig in die richtige Richtung. Der Code von Jens (so ich das richtig sehe) die besonderheit, dass er mit 2 StringListen arbeitet. Vielleicht ist das tatsächlich einfacher (und vielleicht auch schneller). Du wirst schon noch 'ne Lösung bekommen.
Gruß aus Hamburg |
Re: Stringlist dupOnly
Zitat:
Delphi-Quellcode:
Danke nochmal. :wink:
procedure OnlyDupes(var slList: TStringList);
var i: Integer; begin i := 1; while i < slList.Count - 2 do if (slList[i - 1] <> slList[i]) and (slList[i + 1] <> slList[i]) then slList.Delete(i) else inc(i); if slList[0] <> slList[1] then slList.Delete(0); if slList[slList.Count - 1] <> slList[slList.Count - 2] then slList.Delete(slList.Count - 1); end; |
Re: Stringlist dupOnly
Guten Abend,
auch wenn das Problem schon gelöst ist, möchte ich doch noch diese Methode vorstellen.
Delphi-Quellcode:
Grüße
procedure OnlyDupes(var slList: TStringList);
var sldummy : TStringList; begin slDummy := TStringList.create; slDummy.sorted:=true; slDummy.duplicates:=dupIgnore; slDummy.assign(slList); slList.assign(slDummy); slDummy.free; end; Klaus |
Re: Stringlist dupOnly
Hallo Klaus,
also 'mal gaaaaaaaanz vorsichtig gefragt: Es sollen doch alle nur einfach vorhandenen Einträge aus der Liste verschwinden und nur die mehrfach vorhandenen Einträge übrig bleiben. Mit deiner Methode wird m. E. genau das Gegenteil bewirkt, es werden alle Mehrfacheinträge aus der Liste herausgenommen - oder denke ich da jetzt gaaaaaaanz falsch??? Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 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 by Thomas Breitkreuz