2012-12-07 33 views
7

有沒有什麼方法可以對此進行排序?或者我只需要分割它並使用循環進行比較? 輸入如何對ip地址進行升序排序

123.4.245.23 
104.244.253.29 
1.198.3.93 
32.183.93.40 
104.30.244.2 
104.244.4.1 

輸出

1.198.3.93 
32.183.93.40 
104.30.244.2 
104.244.4.1 
104.244.253.29 
123.4.245.23 

到目前爲止,我使用HashMap來存儲我的數據。我想按照升序排列IP地址的值。似乎TreeMap是更好的選擇?

+0

拆分它是要走的路。 – PearsonArtPhoto

+1

是你的IP的字符串類型? – PermGenError

+3

將它們轉換爲長整型然後排序。 http://nscraps.com/Java/1353-convert-ip-address-integer-number.htm – Joe

回答

5

我會建議實施自己的比較器。看到這個帖子:Sorting IP addresses in Java

複製粘貼只爲你:

/** 
* LGPL 
*/ 
public class InetAddressComparator implements Comparator { 
    @Override 
    public int compare(InetAddress adr1, InetAddress adr2) { 
     byte[] ba1 = adr1.getAddress(); 
     byte[] ba2 = adr2.getAddress(); 

     // general ordering: ipv4 before ipv6 
     if(ba1.length < ba2.length) return -1; 
     if(ba1.length > ba2.length) return 1; 

     // we have 2 ips of the same type, so we have to compare each byte 
     for(int i = 0; i < ba1.length; i++) { 
      int b1 = unsignedByteToInt(ba1[i]); 
      int b2 = unsignedByteToInt(ba2[i]); 
      if(b1 == b2) 
       continue; 
      if(b1 < b2) 
       return -1; 
      else 
       return 1; 
     } 
     return 0; 
    } 

    private int unsignedByteToInt(byte b) { 
     return (int) b & 0xFF; 
    } 
} 
+0

不是一個很好的例子,論壇,不是很嚴重的信息。 – AlexWien

+0

@AlexWien您能否詳細說明爲什麼它不是一個好例子? – theon

+0

啊,我看到你正在評論一個論壇鏈接,此後已被刪除。 – theon

2

對於IP4你不會忽略你表現只是 需要將其拆分。那麼我會把它轉換成一個很長的值,並按此排序。

long value = f3 + f2*256 + f1 * 256^2 + f0 * 256^3 

其中f0-f3是分離值。

+0

爲什麼downvote? – AlexWien

2

IP中的每個片段填充到長度3然後sort例如,如下:

List<String> ipList = new ArrayList<String>(); 
    ipList.add("123.4.245.23"); 
    ipList.add("104.244.253.29"); 
    ipList.add("1.198.3.93"); 
    ipList.add("32.183.93.40"); 
    ipList.add("104.30.244.2"); 
    ipList.add("104.244.4.1"); 
    Collections.sort(ipList, new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      String[] ips1 = o1.split("\\."); 
      String updatedIp1 = String.format("%3s.%3s.%3s.%3s", 
                ips1[0],ips1[1],ips1[2],ips1[3]); 
      String[] ips2 = o2.split("\\."); 
      String updatedIp2 = String.format("%3s.%3s.%3s.%3s", 
                ips2[0],ips2[1],ips2[2],ips2[3]); 
      return updatedIp1.compareTo(updatedIp2); 
     } 
    }); 
    //print the sorted IP 
    for(String ip: ipList){ 
     System.out.println(ip); 
    } 

它打印:

1.198.3.93
32.183.93.40
104.30.244.2
104.244.4.1
104.244.253.29
123.4.245.23

+0

@AlexWien試試看,讓我知道。我做了填充只是爲了照顧這個限制。 –

+0

作品,但可怕的慢。 – AlexWien

+1

@AlexWien它花費了0.016秒的時間。 –

1
public class IpSort { 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String[] arr = {"192.168.1.1", 
      "191.122.123.112", 
      "192.161.1.1", 
      "191.122.123.1", 
      "123.24.5.78", 
      "121.24.5.78", 
      "123.24.4.78", 
      "123.2.5.78", 
      "192.1.1.1", 
      "125.45.67.89", 
      "1.1.1.1", 
      "3.4.5.6", 
      "2.2.2.2", 
      "6.6.6.7", 
      "155.155.23.0"}; 
     String tmp; 
     for(int i=0;i<arr.length;i++) 
     { 
        for(int j=1;j<arr.length-i;j++) 
        { 
         String[] instr1 = arr[j-1].split("\\."); 
         String[] instr2 = arr[j].split("\\."); 
          if(Integer.parseInt(instr1[0]) > Integer.parseInt(instr2[0])) 
          { 
           tmp=arr[j-1]; 
           arr[j-1]=arr[j]; 
           arr[j]=tmp; 
          }else if(Integer.parseInt(instr1[0]) == Integer.parseInt(instr2[0]) 
         && Integer.parseInt(instr1[1]) > Integer.parseInt(instr2[1])) 
          { 
           tmp=arr[j-1]; 
           arr[j-1]=arr[j]; 
           arr[j]=tmp; 
          } else if(Integer.parseInt(instr1[0]) == Integer.parseInt(instr2[0]) 
         && Integer.parseInt(instr1[1]) == Integer.parseInt(instr2[1]) 
         && Integer.parseInt(instr1[2]) > Integer.parseInt(instr2[2])) 
          { 
           tmp=arr[j-1]; 
           arr[j-1]=arr[j]; 
           arr[j]=tmp; 
          } else if(Integer.parseInt(instr1[0]) == Integer.parseInt(instr2[0]) 
         && Integer.parseInt(instr1[1]) == Integer.parseInt(instr2[1]) 
         && Integer.parseInt(instr1[2]) == Integer.parseInt(instr2[2]) 
         && Integer.parseInt(instr1[3]) > Integer.parseInt(instr2[3])) 
          { 
           tmp=arr[j-1]; 
           arr[j-1]=arr[j]; 
           arr[j]=tmp; 
          } 
        } 

     } 
     System.out.println("final sorted list of ips :\n"); 
     for(int k=0;k<arr.length;k++){ 
      System.out.println(arr[k]); 
     } 
    } 
} 
6

TLDR

您可以直接跳轉到一個有效的比較方法(見下文編輯部分)OR
繼續你的閱讀。


爲了排序IP,您首先需要了解一些關於它們的信息。有兩種類型的IP; 32 Bit128 Bit

32位Source

32 Bit

  • 32 bit IP被分成4組數字0255之間。這些組通過.
  • 分開,如上所示,單個組是8位數據。這就是組內數字在0255之間有限的原因。
  • 要正確格式化32 bit IP,應該是int.int.int.int。即使int爲0,它也必須顯示在IP地址中。這與可能省略0 s的128 bit IP不同。例如與0:0:5:0:0:0:0:0相同的::5:

128位Source

128 Bit

  • 128 bit IP被分成8組數字0FFFF(其等同於65535)之間。與32 bit IPs羣不同,這些羣組分開購買:
  • 如上所示,單個組是16位數據。這就是組中的數字限制在0FFFF之間的原因。
  • 正確格式化一個128 bit IP有幾個規則你必須遵循。 0可以從組中省略,並且如果剩餘的組全部是0,那麼這些組也可以被省略。這些組必須由:分開。如果您正在省略組,則最後一組不是0後必須跟一個:。這些規則使我們的格式爲int:int:int:int:int:int:int:int0 s和組被省略的例子是58f:::fff:2:。這與58f:0:0:fff:2:0:0:0相同。

排序

一旦IP地址已經被分類成能夠對其進行排序各自集團。要對IP進行排序,您需要使用稱爲加權的方法。這是因爲簡單地將不同的羣組相加或相乘不起作用。例如,採取這兩個IP地址; 192.5.48.198198.48.5.192。如果您將組的值相加或相乘,您會得到相同的答案。所以沒有辦法使用加法和乘法準確地比較它們。如果你使用加權,你會得到這樣的東西。

32位加權

Value of IP = (Group one value * 256^4) + (Group two value * 256^3) + 
       (Group three value * 256^2) + (Group four value * 256) 

128位加權

Value of IP = (Group one value * 65536^8) + (Group two value * 65536^7) + 
       (Group three value * 65536^6) + (Group four value * 65536^5) + 
       (Group five value * 65536^4) + (Group six value * 65536^3) + 
       (Group seven value * 65536^2) + (Group eight value * 65536) 

中的代碼的Java

只要IP格式化合理正確此代碼將分開兩種IP然後對它們進行排序。

import java.util.*; 
import java.math.*; //For BigInteger 
import java.util.regex.*; 
import java.lang.*; 

public class IPSort 
{ 
    String[] tests = {":8:","::::5:6::8","::::5:6::7","::::5:6::8","123..245.23","1...","..1.","123...23",".1..","123..245.23", "123..245.23", "104.244.253.29", "1.198.3.93", "32.183.93.40", "32.183.93.40", "104.30.244.2", "104.244.4.1","0.0.0.1",":a:","::5:3:4:5:6:78","1::2:3","1::2:3:4","1::5:256.2.3.4","1:1:3000.30.30.30","ae80::217:f2ff:254:7:237:98"}; 
    ArrayList<String> bit32 = new ArrayList<String>(); 
    ArrayList<String> bit128 = new ArrayList<String>(); 
    ArrayList<String> cleanBit32 = new ArrayList<String>(); 
    ArrayList<String> cleanBit128 = new ArrayList<String>(); 

    boolean myMatcher32Bit(String s) 
    { 
     Pattern patter32Bit = Pattern.compile("^(?=(?:[^.]*\\.){3}[^.]*$)(?=(?:[^:]*:){0}[^:]*$)(?=(?:[^a-zA-Z]*[^a-zA-Z])*$)"); 
     Matcher matcher32Bit = patter32Bit.matcher(s); 
     return matcher32Bit.find(); 
    } 

    boolean myMatcher128Bit(String s) 
    { 
     Pattern patter128Bit = Pattern.compile("^(?=(?:[^.]*\\.){0}[^.]*$)(?=(?:[^:]*:){1,7}[^:]*$)"); 
     Matcher matcher128Bit = patter128Bit.matcher(s); 
     return matcher128Bit.find(); 
    } 

    public void sortIntoRespectiveIPTypes() 
    { 
     for(String s: tests) 
     { 
      if(myMatcher32Bit(s)) 
      { 
       bit32.add(s); 
      } 
      else if(myMatcher128Bit(s)) 
      { 
       bit128.add(s); 
      } 
     } 

     System.out.println("32 bit IPs"); 
     for(String ip: bit32) 
     { 
      System.out.println(" "+ip); 
     } 

     System.out.println("\n128 bit IPs"); 
     for(String ip: bit128) 
     { 
      System.out.println(" "+ip); 
     } 

     int count = 0; 
     for(String ip: tests) 
     { 
      if(myMatcher32Bit(ip)==false && myMatcher128Bit(ip)==false) 
      { 
       count++; 
      } 
     } 

     if(count != 0) 
     { 
      System.out.println("\nDidn't match an IP format"); 
      for(String ip: tests) 
      { 
       if(myMatcher32Bit(ip)==false && myMatcher128Bit(ip)==false) 
       { 
        System.out.println(" "+ip); 
       } 
      } 
     } 

    } 

    public void sort32BitIPs(ArrayList<String> bit32, ArrayList<String> newBit32) 
    { 
     ArrayList<BigInteger> bigInt32Bit = new ArrayList<BigInteger>(); 
     for(String ip:bit32) 
     { 
      String[] tempArray = ip.split("\\."); 
      int i=0; 
      for(String s:tempArray) 
      { 
       if(s.equals("")) 
       { 
        tempArray[i]="0"; 
       } 
       i++; 
      } 
      bigInt32Bit.add(convert32Bit(tempArray)); 
     } 

     Collections.sort(bigInt32Bit); 

     ArrayList<String> fixFormat = new ArrayList<String>(); 
     for(String ip:bit32) 
     { 
      String[] fixArray = ip.split("\\."); 
      int i=0; 
      for(String s:fixArray) 
      { 
       if(s.equals("")) 
       { 
        fixArray[i]="0"; 
       } 
       i++; 
      } 

      StringBuilder strBuilder = new StringBuilder(); 
      for(int i2 = 0; i2 < 4; i2++) 
      { 
       if(i2<3) 
       { 
        try 
        { 
         if(!fixArray[i2].equals("")) 
         { 
          strBuilder.append(fixArray[i2]+"."); 
         } 
         else 
         { 
          strBuilder.append("."); 
         } 
        } 
        catch(Exception e) 
        { 
         strBuilder.append("0."); 
        } 
       } 
       else 
       { 
        try 
        { 
         strBuilder.append(fixArray[i2]); 
        } 
        catch(Exception e) 
        { 
         strBuilder.append("0"); 
        } 
       } 
      } 
      String newString = strBuilder.toString(); 
      fixFormat.add(newString); 
      bit32=fixFormat; 
     } 

     for(BigInteger finalValue:bigInt32Bit) 
     { 
      for(String ip:bit32) 
      { 
       String[] tempArray = ip.split("\\."); 
       int i=0; 
       for(String s:tempArray) 
       { 
        if(s.equals("")) 
        { 
         tempArray[i]="0"; 
        } 
        i++; 
       } 
       if(finalValue.equals(convert32Bit(tempArray))) 
       { 
        if(!newBit32.contains(ip)) 
        { 
         String str = bit32.toString(); 
         String findStr = ip; 
         int lastIndex = 0; 
         int count = 0; 

         while(lastIndex != -1){ 

          lastIndex = str.indexOf(findStr,lastIndex); 

          if(lastIndex != -1){ 
           count++; 
           lastIndex += findStr.length(); 
          } 
         } 

         for(int k = 0; k<count;k++) 
         { 
          newBit32.add(ip); 
         } 
        } 
       } 
      } 
     } 
    } 

    BigInteger convert32Bit(String[] array) 
    { 
     int[] tempArray = new int[array.length]; 
     ArrayList<BigInteger> tempBigIntList = new ArrayList<BigInteger>(); 
     int i = 0; 
     for(String s:array) 
     { 
      int power = 4-i; 
      tempArray[i]= Integer.parseInt(s); 
      String string = Integer.toString(tempArray[i]); 
      BigInteger myBigInt = new BigInteger(string); 
      BigInteger num2 = myBigInt.multiply(new BigInteger("256").pow(power)); 
      tempBigIntList.add(num2); 
      i++; 
     } 
     BigInteger bigInt32Bit = new BigInteger("0"); 
     for(BigInteger bI:tempBigIntList) 
     { 
      bigInt32Bit = bigInt32Bit.add(bI); 
     } 
     return bigInt32Bit; 
    } 

    public void sort128BitIPs(ArrayList<String> bit128,ArrayList<String> newBit128) 
    { 
     ArrayList<BigInteger> bigInt128Bit = new ArrayList<BigInteger>(); 
     for(String ip:bit128) 
     { 
      String[] tempArray = ip.split(":"); 
      int i=0; 
      for(String s:tempArray) 
      { 
       if(s.equals("")) 
       { 
        tempArray[i]="0"; 
       } 
       i++; 
      } 
      bigInt128Bit.add(convert128Bit(tempArray)); 
     } 

     Collections.sort(bigInt128Bit); 

     for(BigInteger finalValue:bigInt128Bit) 
     { 
      for(String ip:bit128) 
      { 
       String[] tempArray = ip.split(":"); 
       int i=0; 
       for(String s:tempArray) 
       { 
        if(s.equals("")) 
        { 
         tempArray[i]="0"; 
        } 
        i++; 
       } 
       if(finalValue.equals(convert128Bit(tempArray))) 
       { 
        if(!newBit128.contains(ip)) 
        { 
         String str = bit128.toString(); 
         String findStr = ip; 
         int lastIndex = 0; 
         int count = 0; 

         while(lastIndex != -1){ 

          lastIndex = str.indexOf(findStr,lastIndex); 

          if(lastIndex != -1){ 
           count++; 
           lastIndex += findStr.length(); 
          } 
         } 

         for(int k = 0; k<count;k++) 
         { 
          newBit128.add(ip); 
         } 
        } 
       } 
      } 
     } 
    } 

    BigInteger convert128Bit(String[] array) 
    { 
     int[] tempArray = new int[array.length]; 
     ArrayList<BigInteger> tempBigIntList = new ArrayList<BigInteger>(); 
     int i = 0; 
     for(String s:array) 
     { 
      int power = 8-i; 
      tempArray[i]= Integer.parseInt(s,16); 
      String string = Integer.toString(tempArray[i]); 
      BigInteger myBigInt = new BigInteger(string); 
      BigInteger num2 = myBigInt.multiply(new BigInteger("65536").pow(power)); 
      tempBigIntList.add(num2); 
      i++; 
     } 
     BigInteger bigInt128Bit = new BigInteger("0"); 
     for(BigInteger bI:tempBigIntList) 
     { 
      bigInt128Bit = bigInt128Bit.add(bI); 
     } 
     return bigInt128Bit; 
    } 

    public void printInOrder(ArrayList<String> bit32,ArrayList<String> bit128) 
    { 
     System.out.println("\nSorted IPs"); 

     System.out.println("Sorted 32 bit IPs - Ascending"); 
     for(String ip: bit32) 
     { 
      System.out.println(" "+ip); 
     } 

     Collections.reverse(bit32); 
     System.out.println("\nSorted 32 bit IPs - Descending"); 
     for(String ip: bit32) 
     { 
      System.out.println(" "+ip); 
     } 

     System.out.println("\nSorted 128 bit IPs - Ascending"); 
     for(String ip: bit128) 
     { 
      System.out.println(" "+ip); 
     } 

     Collections.reverse(bit128); 
     System.out.println("\nSorted 128 bit IPs - Descending"); 
     for(String ip: bit128) 
     { 
      System.out.println(" "+ip); 
     } 
    } 

    public void run(ArrayList<String> bit32,ArrayList<String> bit128,ArrayList<String> newBit32,ArrayList<String> newBit128) 
    { 
     sortIntoRespectiveIPTypes(); 
     sort32BitIPs(bit32,newBit32); 
     sort128BitIPs(bit128,newBit128); 
     printInOrder(newBit32,newBit128); 
    } 

    public static void main(String[] args) 
    { 
     IPSort ipS = new IPSort(); 
     ipS.run(ipS.bit32,ipS.bit128,ipS.cleanBit32,ipS.cleanBit128); 
    } 
} 

作爲一個說明,可以使用this class IPS的排序,但我的代碼不使用它

此代碼還對列表進行排序爲升序排列,然後進入一個降序排列。這在命令控制檯打印出來時,代碼運行

輸出

Output

編輯

一種更有效和準確的方法來做到這一點是與所述上面提到的InetAddress class。代碼爲200_success

import java.net.InetAddress; 
import java.net.Inet4Address; 
import java.net.Inet6Address; 
import java.net.UnknownHostException; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Optional; 
import java.util.stream.Stream; 

public class IPSort { 
    private static String[] TESTS = {"0:0:0:0:0:0:fff:ffff","::FFFF:222.1.41.90",":8:","::::5:6::8","::::5:6::7","::::5:6::8","123..245.23","1...","..1.","123...23",".1..","123..245.23", "123..245.23", "104.244.253.29", "1.198.3.93", "32.183.93.40", "32.183.93.40", "104.30.244.2", "104.244.4.1","0.0.0.1",":a:","::5:3:4:5:6:78","1::2:3","1::2:3:4","1::5:256.2.3.4","1:1:3000.30.30.30","ae80::217:f2ff:254:7:237:98","::2:3:4:5:6:7","2:3:4:5:6:7","::5:3:4:5:6:7:8","::5:3:4:5:6:7:8:9:0","1::8","1::2:3","1::2:3:4","1::5:256.2.3.4","1:1:3000.30.30.30","ae80::217:f2ff:254.7.237.98","1:2:3:4::5:1.2.3.4","2001:0000:1234:0000:0000:C1C0:ABCD:0876","12345::6:7:8","1::1.2.900.4","fe80::","::ffff:0:0"}; 

    public static class InetAddressComparator implements Comparator<InetAddress> { 
     @Override 
     public int compare(InetAddress a, InetAddress b) { 
      byte[] aOctets = a.getAddress(), 
        bOctets = b.getAddress(); 
      int len = Math.max(aOctets.length, bOctets.length); 
      for (int i = 0; i < len; i++) { 
       byte aOctet = (i >= len - aOctets.length) ? 
        aOctets[i - (len - aOctets.length)] : 0; 
       byte bOctet = (i >= len - bOctets.length) ? 
        bOctets[i - (len - bOctets.length)] : 0; 
       if (aOctet != bOctet) return (0xff & aOctet) - (0xff & bOctet); 
      } 
      return 0; 
     } 
    } 

    public static Optional<InetAddress> toInetAddress(String s) { 
     try { 
      return Optional.of(InetAddress.getByName(s)); 
     } catch (UnknownHostException badAddress) { 
      return Optional.empty(); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     System.out.println("Valid 32-bit addresses"); 
     Arrays.stream(TESTS) 
       .map(IPSort::toInetAddress) 
       .filter(Optional::isPresent) 
       .map(Optional::get) 
       .filter((addr) -> addr instanceof Inet4Address) 
       .map(InetAddress::getHostAddress) 
       .forEach(System.out::println); 

     System.out.println("\nValid 128-bit addresses"); 
     Arrays.stream(TESTS) 
       .map(IPSort::toInetAddress) 
       .filter(Optional::isPresent) 
       .map(Optional::get) 
       .filter((addr) -> addr instanceof Inet6Address) 
       .map(InetAddress::getHostAddress) 
       .forEach(System.out::println); 

     System.out.println("\nInvalid addresses"); 
     Arrays.stream(TESTS) 
       .filter((s) -> !toInetAddress(s).isPresent()) 
       .forEach(System.out::println); 

     System.out.println("\nSorted addresses"); 
     Arrays.stream(TESTS) 
       .map(IPSort::toInetAddress) 
       .filter(Optional::isPresent) 
       .map(Optional::get) 
       .sorted(new InetAddressComparator()) 
       .map(InetAddress::getHostAddress) 
       .forEach(System.out::println); 
    } 
} 
0

這樣如何純邏輯:

IP地址: [10.1.1.2,10.22.33.11,10.12.23.12]

1)填寫IP完成12位格式前綴0: 像 [010.001.001.002,010.022.033.011,010.012.023,012]

2)拆下s至使它的數字串完全 「」: [010001001002,010022033011,010012023012]

3)應用排序 [010001001002,010012023012,010022033011],每3個數字後

4)保留點: [010.001.001.002,010.012.023.012,010.022.033.011]

5)拆下前綴0的 [10.1.1.2,10.12.23.12,10.22.33.11]

6)Sorted!

0
public class SortIP 
{ 

    public static String getFormattedIP(String ip) 
    { 
     String arg[] = new String[4]; 
     arg = (ip).split("\\."); 

     int i=0; 
     while(i<=3) 
     { 
      if(arg[i].length()==1) 
      { 
       arg[i]="00"+arg[i]; 
      } 
      else if(arg[i].length()==2) 
      { 
       arg[i]="0"+arg[i]; 
      } 

      i++; 
     } 

     return arg[0]+arg[1]+arg[2]+arg[3]; 
    } 

    public static ArrayList<Integer> sortedList(Object[] obj,String order) 
    { 
     if(order.equalsIgnoreCase("Ascending")) 
     { 
      Arrays.sort(obj, new Comparator() { 
       public int compare(Object o1, Object o2) { 
        return ((Map.Entry<Integer, Long>) o1).getValue() 
           .compareTo(((Map.Entry<Integer, Long>) o2).getValue()); 
       } 
      }); 
     } 
     else 
     { 
      Arrays.sort(obj, new Comparator() { 
       public int compare(Object o1, Object o2) { 
        return ((Map.Entry<Integer, Long>) o2).getValue() 
           .compareTo(((Map.Entry<Integer, Long>) o1).getValue()); 
       } 
      }); 
     } 

     int counter=0; 
     ArrayList<Integer> key = new ArrayList<Integer>(); 
     //int key[] = new int[ipRange.size()]; 

     for (Object e : obj) { 
      key.add(((Map.Entry<Integer, Long>) e).getKey()); 
      //key[counter++]=((Map.Entry<Integer, Long>) e).getKey(); 

      System.out.println(((Map.Entry<Integer, Long>) e).getKey() + " : " + ((Map.Entry<Integer, Long>) e).getValue()); 
     } 

     return key; 
    } 

    public static void main(String[] args) 
    { 
     Map<Integer,String> ipRange= new TreeMap<Integer,String>(); 
     Map<Integer,Long> formatedIpRange= new TreeMap<Integer,Long>(); 

     ipRange.put(1, "10.1.4.100"); 
     ipRange.put(2, "1.10.400.10"); 
     ipRange.put(3, "196.0.14.15"); 
     ipRange.put(4, "196.70.5.1"); 
     ipRange.put(5, "196.70.7.3"); 
     ipRange.put(6, "153.70.7.0"); 

     for(int j=1;j<=ipRange.size();j++) 
     { 
      formatedIpRange.put(j, Long.parseLong(getFormattedIP(ipRange.get(j)))); 
     } 

     Object[] a = formatedIpRange.entrySet().toArray(); 

     ArrayList<Integer> key = sortedList(a,"descending"); 

     System.out.println("ordered list "); 

     for (Integer integer : key) 
     { 
      System.out.println(ipRange.get(integer)); 
     } 
    } 
} 
0

在Java8

import java.math.BigInteger; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.util.AbstractMap; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.Map; 

class Test { 
    private static final Comparator<InetAddress> COMPARATOR = Comparator 
      .comparing(InetAddress::getAddress, 
        Comparator.comparingInt((byte[] b) -> b.length) 
        .thenComparing(b -> new BigInteger(1, b))); 

    public static void main(String[] args) { 
     final String[] addresses = { 
       "123.4.245.23", 
       "104.244.253.29", 
       "1.198.3.93", 
       "32.183.93.40", 
       "104.30.244.2", 
       "104.244.4.1" 
     }; 

     for (final String address : sort(addresses)) { 
      System.out.println(address); 
     } 
    } 

    public static String[] sort(final String[] addresses) { 
     return Arrays.stream(addresses) 
       .map(s -> new AbstractMap.SimpleImmutableEntry<>(toInetAddress(s), s)) 
       .sorted(Comparator.comparing(Map.Entry::getKey, Comparator.nullsLast(COMPARATOR))) 
       .map(Map.Entry::getValue) 
       .toArray(String[]::new); 
    } 

    private static InetAddress toInetAddress(final String address) { 
     try { 
      return InetAddress.getByName(address); 
     } catch (final UnknownHostException | SecurityException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

輸出:

 
1.198.3.93 
32.183.93.40 
104.30.244.2 
104.244.4.1 
104.244.253.29 
123.4.245.23 

相關問題