繁体   English   中英

用Java排序IP地址

[英]Sorting IP addresses in Java

我已经在该站点上阅读了以下内容: 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

尝试这个

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;
    }
}

这给您订单。 希望对您有所帮助

有序IP

尝试这个。

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM