How to sort ip address in ascending order

后端 未结 9 1818
自闭症患者
自闭症患者 2020-12-16 02:32

Is there any method to sort this? Or do I just need to split it and use a loop to compare? Input

123.4.245.23
104.244.253.29
1.198.3.93
32.183.93.40
104.30.2         


        
相关标签:
9条回答
  • 2020-12-16 03:31
    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]);  
            }  
        }  
    }  
    
    0 讨论(0)
  • 2020-12-16 03:34

    I would suggest to implement your own Comparator. See this post: Sorting IP addresses in Java

    Copy paste only for you:

    /**
     * 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 讨论(0)
  • 2020-12-16 03:36

    Try this one

    @Override
    public int compare(Object adr1, Object adr2) {
        try
        {
            if(adr1 == null || adr1.toString().isEmpty()) return -1;
            if(adr2 == null || adr2.toString().isEmpty()) return 1;
            String[] ba1 = adr1.toString().split( "\\." );
            String[] ba2 = adr2.toString().split( "\\." );
    
            for ( int i = 0; i < ba1.length; i++ )
            {
                int b1 = Integer.parseInt( ba1[ i ] );
                int b2 = Integer.parseInt( ba2[ i ] );
    
                if (b1 == b2)
                    continue;
                if (b1 < b2)
                    return -1;
                else
                    return 1;
            }
            return 0;
        }
        catch ( Exception ex )
        {
            return 0;
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题