2015-11-30 35 views
1

我已閱讀本網站,包括:link1link2其中包括如何在Java中對IP地址(字符串表示形式)進行排序。但是我沒有得到正確的輸出。在Java中排序IP地址

我的數據(一個例子):

:: 2:3:4:5:6:7

:: 2:3:4:5:6:7:8

1 :: 8

1 :: 2:3

1 :: 2:3:4

1 :: 5:256.2.3.4

1 :: 3000.30.30.30

FE80 :: 217:f2ff:254.7.237.98,1:2:3:4 :: 5:1.2.3.4

2001:0000:1234:0000: 0000:C1C0:ABCD:0876

我加入這些IP地址(一些有效的一些無效)到一個ArrayList,然後將它傳遞給下面這樣:

ArrayList <String> list = new ArrayList<String>(); 

String [] tests = {"::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"}; 

//添加到ArrayList的

for (String test1 : tests) { 
    list.add(test1); 
    } 

//比較和排序

Collections.sort(list); 
    Collections.reverse(list); 

    //Collections.sort(ipList, new Comparator<String>() { 
    for(String ip: list){ 
    System.out.println(ip); 
} 

但是我不能夠將數據正確地排序,並在降序排列得到排序不正確的結果。任何人都可以指導我更好的方式?提前致謝。請之間的IP地址記住 「::」 有一個零,因此這相當於0:0:0

結果我得到的是:

FE80 ::

ae80 :: 217: f2ff:254.7.237.98,1:2:3:4 :: 5:1.2.3.4

:: FFFF:0:0

:: 5:3:4:5:6:7:8 :9:0

:: 5:3:4:5:6:7:8

:: 2:3:4:5:6:7

2:3:4:5:6:7

2001:0000:1234:0000:0000:C1C0:ABCD:0876

1 :: 8

1 :: 5:256.2.3.4

1 :: 2:3:4

1 :: 2:3

1 :: 1.2.900。4

1:1:3000.30.30.30

12345 :: 6:7:8

+2

你不排序「IP地址」。您正在對正好包含人類可讀版本IP的** STRINGS **進行排序。如果您想按照適當的數字順序對它們進行排序,則必須將PARSED變爲內部數字格式,然後對這些數字版本進行排序。 –

+0

使用自定義比較器。 – StackFlowed

+0

是的,我意識到這一點。但是,當你PARSE(我感到一些憤怒大聲笑)0:0:4大於1:1:0這不是我想要的。無論如何感謝指導。 –

回答

1

嘗試此

Test.java

import java.util.*; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     ArrayList <String> list = new ArrayList<String>(); 
     String [] tests = {"::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"}; 
     for (String test1 : tests) 
     { 
      list.add(test1); 
     } 

     System.out.println(); 
     System.out.println("Ascending Order"); 

     Collections.sort(list, new AlphanumComparator()); 
     for(String ip: list) 
     { 
      System.out.println(ip); 
     } 

     System.out.println(); 
     System.out.println("Descending Order"); 

     Collections.reverse(list); 
     for(String ip: list) 
     { 
      System.out.println(ip); 
     } 
    } 
} 

AlphanumComparator.java

import java.util.Comparator; 

public class AlphanumComparator implements Comparator 
{ 
    private final boolean isDigit(char ch) 
    { 
     return ch >= 48 && ch <= 57; 
    } 

    private final String getChunk(String s, int slength, int marker) 
    { 
     StringBuilder chunk = new StringBuilder(); 
     char c = s.charAt(marker); 
     chunk.append(c); 
     marker++; 
     if (isDigit(c)) 
     { 
      while (marker < slength) 
      { 
       c = s.charAt(marker); 
       if (!isDigit(c)) 
        break; 
       chunk.append(c); 
       marker++; 
      } 
     } else 
     { 
      while (marker < slength) 
      { 
       c = s.charAt(marker); 
       if (isDigit(c)) 
        break; 
       chunk.append(c); 
       marker++; 
      } 
     } 
     return chunk.toString(); 
    } 

    public int compare(Object o1, Object o2) 
    { 
     if (!(o1 instanceof String) || !(o2 instanceof String)) 
     { 
      return 0; 
     } 
     String s1 = (String)o1; 
     String s2 = (String)o2; 

     int thisMarker = 0; 
     int thatMarker = 0; 
     int s1Length = s1.length(); 
     int s2Length = s2.length(); 

     while (thisMarker < s1Length && thatMarker < s2Length) 
     { 
      String thisChunk = getChunk(s1, s1Length, thisMarker); 
      thisMarker += thisChunk.length(); 

      String thatChunk = getChunk(s2, s2Length, thatMarker); 
      thatMarker += thatChunk.length(); 

      int result = 0; 
      if (isDigit(thisChunk.charAt(0)) && isDigit(thatChunk.charAt(0))) 
      { 
       int thisChunkLength = thisChunk.length(); 
       result = thisChunkLength - thatChunk.length(); 
       if (result == 0) 
       { 
        for (int i = 0; i < thisChunkLength; i++) 
        { 
         result = thisChunk.charAt(i) - thatChunk.charAt(i); 
         if (result != 0) 
         { 
          return result; 
         } 
        } 
       } 
      } else 
      { 
       result = thisChunk.compareTo(thatChunk); 
      } 

      if (result != 0) 
       return result; 
     } 

     return s1Length - s2Length; 
    } 
} 

這給你的訂單。我希望幫助

Ordered IPs

0

試試這個。

static String normalizeIP(String s) { 
    try { 
     byte[] b = InetAddress.getByName(s).getAddress(); 
     StringBuilder sb = new StringBuilder(); 
     for (byte e : b) 
      sb.append(String.format("%03d", Byte.toUnsignedInt(e))); 
     return sb.toString(); 
    } catch (UnknownHostException e) { 
     return s; 
    } 
} 

public static void main(String[] args) { 
    String[] ads = { 
     "::2:3:4:5:6:7", 
     "::2:3:4:5:6:7:8", 
     "1::8", 
     "1::2:3", 
     "1::2:3:4", 
     "1::5:255.2.3.4", 
     "fe80::217:f2ff:254.7.237.98", 
     "1:2:3:4::5:1.2.3.4", 
     "2001:0000:1234:0000:0000:C1C0:ABCD:0876",}; 
    Arrays.sort(ads, (a, b) -> normalizeIP(b).compareTo(normalizeIP(a))); 
    for (String s : ads) 
     System.out.println(s); 
}