Hallo,
oder wie wärs hiermit? (extra für dich!)
Ansatz über Zeiger mit dem Nachteil daß eine große Liste extra Memory braucht, aber schnell sein dürfte ...
Delphi-Quellcode:
function SeekStrings(List: TStringList;strs: TStringList): TStringList;
var
i,j,k,m: integer;
s1:
String;
s2:
String;
begin
{ Safety }
Result :=
Nil;
if not Assigned(List)
or not Assigned(strs)
then exit;
i := 0;
j := 0;
k := 0;
m := 0;
s1 := '
';
s2 := '
';
{ Action }
s1 := List.Text+#0;
//Liste ine eine Zeichenkette für ZeigerWandern umwandeln:
{ Nachteil platz, Vorteil Speed }
m := Length(s1)-1;
// Bytelänge dieses Textes ohne unseren #0 abschluss
if (m>0)
then // gibt's überhaupt was zu tun ?
begin
Result:=TStringList.Create;
// Ergebnisliste vorbereiten
for j:=0
to strs.Count-1
do // für alle zu suchende Wörter
begin
i := 1 ;
k := 0;
s2 := strs[j]+#0;
// Suchwort für pChar Zeiger vorbereiten
While (AnsiStrPos(@s1[i],@s2[1])<>
NIL)
do // s2 suchen ab position s1[i]
begin
inc(k);
// fündig also Zähler erhöhen
inc(i,Length(s2)-1);
// Offset für nächste Suchposition
if (i>m)
then // security damit i keine exception lösen kann
break;
end;
if (k>0)
then Result.Add(s2+'
='+IntToStr(k));
end;
{ Falls nichts gefunden }
if (Result.Count<1)
then
FreeAndNil(Result)
end;
end;