Sharky, du hast tatsächlich einen Fehler in meiner Routine gefunden und alzaimar hat ihn korrekt erklärt. Vielen Dank euch beiden.
Delphi-Quellcode:
procedure KeepDuplicates(sl: TStringList; allDuplicates: boolean = false);
var
i, j, dist: integer;
begin
if not sl.Sorted
then
sl.Sort;
for i := sl.Count - 1
downto 0
do begin
j := i;
// "j := sl.IndexOf(sl[i])" würde einen sporadischen Fehler produzieren
while (j > 0)
and (sl[j - 1] = sl[j])
do
Dec(j);
dist := i - j;
if (dist = 0)
or (
not allDuplicates
and (dist > 1))
then
sl.Delete(i);
end;
end;
Die Routine stammt aus einer Sammlung von Mengenoperationen auf Strings. Benutzt habe ich sie nie, aber der zugehörige Testcode erzeugte seine Testdaten so:
Delphi-Quellcode:
for i := 1 to 20 do
sl.Add(IntToStr(Random(30)));
Was soll ich sagen, damit produzierte der Code in den ersten Durchläufen korrekte Ergebnisse. Ich werde meinen Testcode wohl etwas verfeinern müssen...
Verlegene Grüße vom marabu
PS: Fehler nach Hinweis von alzaimar korrigiert