Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
Delphi 12 Athens
|
Re: IP-Adressen sortieren
28. Dez 2004, 11:39
Folgender Funktionsentwurf würde gehen. Dieser ist jetzt weder schön noch gut, aber sollte gehen und Dir einen Ansatz liefern Voraussatzung ist, dass die Werte in einer TStringListe stehen.
Delphi-Quellcode:
// diese Funktion wird an die CustomSort methode der StringList übergeben
// siehe weiter unten für das Beispiel...
function IPSort(List: TStringList; Index1, Index2: Integer): Integer;
var
S1, S2: String;
// indizies
I11, I12, I21, I22,
// bytewerte
I1B, I2B: Byte;
begin
S1 := List[Index1];
S2 := List[Index2];
// erstes Byte vergleichen
I11 := Pos('.', S1);
I1B := StrToIntDef(Copy(S1, 1, Pred(I11)), -1);
I21 := Pos('.', S2);
I2B := StrToIntDef(Copy(S2, 1, Pred(I21)), -1);
if I1B < I2B then
begin
Result := -4
end
else if I1B > I2B then
begin
Result := 4
end
else
begin
// zweites Byte vergleichen
Inc(I11);
I12 := PosEx('.', S1, I11);
I1B := StrToIntDef(Copy(S1, I11, I12 - I11), -1);
Inc(I21);
I22 := PosEx('.', S1, I21);
I2B := StrToIntDef(Copy(S2, I21, I22 - I21), -1);
if I1B < I2B then
begin
Result := -3
end
else if I1B > I2B then
begin
Result := 3
end
else
begin
// drittes Byte vergleichen
Inc(I12);
I11 := PosEx('.', S1, I12);
I1B := StrToIntDef(Copy(S1, I12, I11 - I12), -1);
Inc(I22);
I21 := PosEx('.', S1, I22);
I2B := StrToIntDef(Copy(S2, I22, I21 - I22), -1);
if I1B < I2B then
begin
Result := -2
end
else if I1B > I2B then
begin
Result := 2
end
else
begin
// viertes Byte vergleichen
Inc(I11);
I12 := PosEx('.', S1, I11);
I1B := StrToIntDef(Copy(S1, I11, MaxInt), -1);
Inc(I21);
I22 := PosEx('.', S1, I21);
I2B := StrToIntDef(Copy(S2, I21, MaxInt), -1);
if I1B < I2B then
begin
Result := -1
end
else if I1B > I2B then
begin
Result := 1
end
else
begin
Result := 0;
end;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SL := TStringList.Create;
try
/// WERTE IN DIE STRING-LISTE EINTRAGEN
....
/// STRING-LISTE SORTIEREN
SL.CustomSort(IPSort);
/// und zum beispiel in ein Memo schreiben
Memo1.Lines.Assign(SL);
finally
SL.Free;
end;
end;
... ...
Daniel Lizbeth Ich bin nicht zurück, ich tue nur so
|