用Java排序IP地址

时间:2015-11-30 18:49:12

标签: java list sorting ip compare

我已阅读本网站上的内容:link1link2以及如何在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);
}

但是,我无法正确排序数据并在 DESCENDING ORDER 中获得错误排序的结果。任何人都可以指导我更好的方式吗?提前致谢。请记住在“::”之间的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 个答案:

答案 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

答案 1 :(得分:0)

试试这个。

git-receive-pack