Delphi-Quellcode:
function KuerzeDateiname(S:
String; Len: Integer):
String;
var
i, i2: Integer;
SL: TStrings;
begin
// ungültige Zeichen entfernen
for i := Length(S)
downto 1
do
if not (S[i]
in ['
', '
a'..'
z', '
A'..'
Z', '
0'..'
9'])
then
Delete(S, i, 1);
// ungültige Zahlen entfernen
while (i > 0)
and (S[i]
in ['
0'..'
9'])
do
Dec(i);
for i := i
downto 1
do
if S[i]
in ['
0'..'
9']
then
Delete(S, i, 1);
//
SL := TStringList.Create;
try
// String aufsplitten
SL.LineBreak := '
';
SL.Delimiter := '
';
SL.StrictDelimiter := True;
SL.DelimitedText := S;
// längstes Wort suchen
i2 := 0;
for i := SL.Count -1
downto 0
do
i2 := Max(i2, Length(SL[i]));
// Anzahl der zu entfernenden Zeichen
Len := Length(SL.Text) - Len;
// kurze Wörter (Einzelbuchstaben) entfernen
i := SL.Count - 1;
while (Len > 0)
and (i >= 0)
do begin
if Length(SL[i]) = 1
then begin
SL.Delete(i);
Dec(Len);
end;
Dec(i);
end;
// Wörter kürzen
i := -1;
while (Len > 0)
do begin
if i < 0
then begin
i := SL.Count - 1;
Dec(i2);
end;
if Length(SL[i]) > i2
then begin
SL[i] := Copy(SL[i], 1, i2);
Dec(Len);
end;
Dec(i);
end;
// Text zusammensetzen und ausgeben
Result := SL.Text;
finally
SL.Free;
end;
end;
Bezüglich den doppelten Ergbnissen:
da müßte man jetzt bei
Result := SL.Text;
prüfen ob es das schon gibt, zu
// String aufsplitten
zurückspringen ('ne Repeat-Schleife mit Prüfung auf Doppeltes am Ende) und dann beim wiederholten Durchlauf einige der Löschungen überspringen und das dann solange bis es am Ende einzigartig ist.
Wie viele Buchstaben müssen denn im Durchschnitt gelöscht werden?
Jenachdem müßte man die Löschüberspringverwaltung erstellen (bis 32 = Integer, bis 64 = Int64, bis 256 = Set of Byte, mehr = Liste).