TStringlist har en property du kan sætte så du ikke har dups. hvis det er meget nødvendigt kan du muligvis bruge en af de events stringlisten har eller en try except til at tælle op hvilken en der var dup når du flytter over i den nye liste
Martin's forslag duer ikke hvis det er vigtigt at få at vide hvor mange der var (det lyder det til)
Hvilken udgave af Delphi sidder du med? Hvis det er 2009 ville jeg nok bruge en TDictionary til at tælle op i en løkke, og så tilføje strengene bagefter. Ellers ville jeg sortere listen, løbe den igennem mens jeg vedligeholder en tæller, og så tilføje en linje lige når jeg kan se ordet skifter.
Nu er jeg ikke sikker, men MENER TStringList har en Sort - det går jeg ud fra hernede. Forudsætter ingen tomme strenge:
function CountDuplicates(oldStringList: TStringList): TStringList var lastString:string; i,count:integer; begin lastString := ''; Result := TStringList.Create(); for i := 0 to oldStringList.Count - 1 do begin if lastString <> '' and lastString <> oldStringList.Strings[i] then begin Result.Add(laststring+','+inttostr(count)); count := 0; end; count := count + 1; lastString := oldStringList.Strings[i]; end; Result.Add(laststring+','+inttostr(count)); end;
Utestet, forbehold for off-by-one fejl, syntaksfejl, etc.
procedure TfrmMain.MoveAndCount(aSource, aDestination: TStrings); var List: TStringList; i, Index, Count: integer; begin List := TStringList.Create; try List.Duplicates := dupIgnore; List.NameValueSeparator := ','; for i := 0 to aSource.Count - 1 do begin Count := 0; Index := List.IndexOfName(aSource[i]); if Index < 0 then List.Add(format('%s,%d',[aSource[i],Count])) else begin Count := StrToInt(List.ValueFromIndex[Index]) + 1; List.ValueFromIndex[Index] := IntToStr(Count); end; end; aDestination.Assign(List); finally List.Free; end; end;
procedure TfrmMain.MoveAndCount(aSource, aDestination: TStrings); var List: TStringList; i, Index: integer; begin List := TStringList.Create; try List.Duplicates := dupIgnore; List.NameValueSeparator := ','; for i := 0 to aSource.Count - 1 do begin Index := List.IndexOfName(aSource[i]); if Index < 0 then List.Add(format('%s%s%d',[aSource[i],List.NameValueSeparator,1])) else List.ValueFromIndex[Index] := IntToStr(StrToInt(List.ValueFromIndex[Index]) + 1); end; aDestination.Assign(List); finally List.Free; end; end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.