Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IP-Adressen sortieren (https://www.delphipraxis.net/36915-ip-adressen-sortieren.html)

sminds 28. Dez 2004 09:19


IP-Adressen sortieren
 
Habe eine kleine Anwendung geschrieben, wo alle IP-Adressen unserer Fa. gesammelt werden.
Die IP-Adresse trage ich in ein String-Feld ein; allerdings habe ich bisher
keine Möglichkeit gefunden, die IP-Adressen in sortierter Reihenfolge auszugeben.

Vielleicht kennt jemand eine Funktion, der aus dieser Liste

10.250.150.1
10.250.150.10
10.250.150.11
10.250.150.2
...

diese macht

10.250.150.1
10.250.150.2
10.250.150.10
10.250.150.11
...

Vielen Dank und noch allen Frohe Weihnachten :-D

sakura 28. Dez 2004 09:22

Re: IP-Adressen sortieren
 
Da musst Du selbst Hand anlegen. Mir ist dafür keine Standard-Funktion bekannt. Ein nach dem Punkt [dp:dbe1a94717=split]splitten[/dp:dbe1a94717] und dann die einzelnen Integerwerte jeweils vergleichen.

...:cat:...

sminds 28. Dez 2004 09:26

Re: IP-Adressen sortieren
 
Zitat:

Zitat von sakura
Da musst Du selbst Hand anlegen. Mir ist dafür keine Standard-Funktion bekannt. Ein nach dem Punkt [dp:2747ac72ab=split]splitten[/dp:2747ac72ab] und dann die einzelnen Integerwerte jeweils vergleichen.

...:cat:...


OK,
Danke. :hi:

arbu man 28. Dez 2004 09:38

Re: IP-Adressen sortieren
 
IP`s in sringliste laden und dann stringlist.sort

Duffy 28. Dez 2004 09:40

Re: IP-Adressen sortieren
 
Hallo arbu man,
dann kommt das raus, was man nicht haben will ...

bye
Claus

arbu man 28. Dez 2004 09:56

Re: IP-Adressen sortieren
 
Dann Spliten und die Zahlen mit dieser funktion sortieren

Delphi-Quellcode:
procedure sort2 (var a: array of word);
var bis,i,j,k : longint;
    h        : word;
begin
    bis := high(a);
    k  := bis shr 1; { div 2 }
    While k > 0 do begin
        For i := 0 To bis - k do begin
            j := i;
            While (j >= 0) And (a[j] > a[j + k]) do begin
                h  := a[j];
                a[j]:= a[j + k];
                a[j + k] := h;
                dec(j,k);
            end;
        end;
        k := k shr 1; { div 2 }
    end;
End;

sakura 28. Dez 2004 10:17

Re: IP-Adressen sortieren
 
@arbu man: Ich weiß absolut nicht, was Deine Funktion erreichen soll. Du solltest etwas mehr Code liefern, zumal ich glaube, dass Du am Problem vorbei denkst...

...:cat:...

sakura 28. Dez 2004 10:39

Re: IP-Adressen sortieren
 
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;
...:cat:...

sminds 28. Dez 2004 10:48

Re: IP-Adressen sortieren
 
Danke für die vielen Antworten!

Habe es jetzt mit einer SQL-Abfrage gelöst, da ich die IP-Adressen in einer Datenbank habe.

SQL-Code:
select ipadresse,
ip1=cast(substring(substring(ipadresse,8,10),1,patindex('%.%',substring(ipadresse,8,10))-1) as integeR),
ip2=cast(substring(substring(ipadresse,8,10),patindex('%.%',substring(ipadresse,8,10))+1,10) as integer)
from computer
order by ip1,ip2

Resultat:

ipadresse ip1 ip2
--------------- ----------- -----------
10.250.74.13 74 13
10.250.90.10 90 10
10.250.90.11 90 11
10.250.90.12 90 12
10.250.90.20 90 20
10.250.150.4 150 4
10.250.150.5 150 5
10.250.150.6 150 6
10.250.150.7 150 7
10.250.150.8 150 8
10.250.150.9 150 9
10.250.150.10 150 10


PS. Funktioniert, da wir das Subnet 255.255.0.0 haben und somit 10.250. immer fix bleibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz