Java如何对IP地址列表进行排序

时间:2017-05-19 21:29:59

标签: java sorting

我想按升序排序IP地址列表,最简单的方法是什么?

例如,我在List

中有这些IP地址
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author myu
 */
public class SortListProject {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        List addressList = new ArrayList();
        addressList.add("192.168.0.5");
        addressList.add("192.168.0.1");
        addressList.add("192.168.25.1");
        addressList.add("192.168.10.21");
        addressList.add("192.168.77.1");

        System.out.println(addressList);
    }

}

我想用以下输出对列表进行排序:

{192.168.0.1, 192.168.0.5, 192.168.10.21, 192.168.25.1, 192.168.77.1}

6 个答案:

答案 0 :(得分:2)

您正在使用原始类型。请不要这样做。接下来,您需要解析String表示以从IP中的四个八位字节中获取int值(或192.168.100.1将在192.168.2.1之前得到)。您可以将自定义Comparator传递给Collections.sort。假设您使用的是Java 8+,它们可能看起来像

List<String> addressList = new ArrayList<>(Arrays.asList("192.168.0.5", // 
        "192.168.0.1", "192.168.25.1", "192.168.10.21", "192.168.77.1"));
Collections.sort(addressList, (a, b) -> {
    int[] aOct = Arrays.stream(a.split("\\.")).mapToInt(Integer::parseInt).toArray();
    int[] bOct = Arrays.stream(b.split("\\.")).mapToInt(Integer::parseInt).toArray();
    int r = 0;
    for (int i = 0; i < aOct.length && i < bOct.length; i++) {
        r = Integer.compare(aOct[i], bOct[i]);
        if (r != 0) {
            return r;
        }
    }
    return r;
});
System.out.println(addressList);

答案 1 :(得分:1)

您可以使用{"box_background_color":"red","box_text_color":"white","test3_var2":3,"name":"test name","email":"email@email.com","box_border_color":"orange"} box_background_color::::red box_text_color::::white test3_var2::::3 name::::test name email::::email@email.com box_border_color::::orange TestClass1 [_name=test name, _emailAddress=email@email.com, innerClass=TestClass2 [_boxBackgroundColor=red, _boxBorderColor=orange, _boxTextColor=white], innerClass2=TestClass3 [_test3Var1=null, _test3Var2=3]] 进行排序,例如:

Collections.sort

<强>输出:

List<String> addressList = new ArrayList<>();
addressList.add("192.168.0.5");
addressList.add("192.168.0.1");
addressList.add("192.168.25.1");
addressList.add("192.168.10.21");
addressList.add("192.168.77.1");

Collections.sort(addressList, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        String[] ip1 = o1.split("\\.");
        String ipFormatted1 = String.format("%3s.%3s.%3s.%3s", ip1[0],ip1[1],ip1[2],ip1[3]);
        String[] ip2 = o2.split("\\.");
        String ipFormatted2 = String.format("%3s.%3s.%3s.%3s",  ip2[0],ip2[1],ip2[2],ip2[3]);
        return ipFormatted1.compareTo(ipFormatted2);
    }
});
System.out.println("sorted: " + addressList);

答案 2 :(得分:1)

正确的方法是使用comparatorgenerics(如前所述)。请注意,接受输入数据的谬误完全取决于您的期望。例如,在IP的情况下:Java Socket API接受127.0.0.1127.0.0.01。但是你所写的那种也应该考虑到这些因素。因此,我建议您使用基于IP地址的字节(八位字节)的排序。

有很多例子可以做到,我不会这样做。一个简单的搜索将引导您到这个网站上的一个。

我要做的是证明需要按八位字节排序:

byte[] ipAddr1 = new byte[] { x1, x2, (byte) 010, x4 };
byte[] ipAddr2 = new byte[] { x1, x2, 9, x4 };
InetAddress addr = InetAddress.getByAddress(ipAddr1);
InetAddress addr = InetAddress.getByAddress(ipAddr2);

这两个都被Java Socket库接受,但没有报告任何错误。它们都可以工作,但是如果你在不考虑单个八位字节的情况下对它进行排序(例如进行字符串排序),那么结果可能不是你所期望的。试一试,看看。

例如(如果您遵循Collections.sort(list)方法):如果您有:“192.160.010.1”和“192.160.9.1”。你会看到前者看起来比后者少,但事实并非如此。原因是这将基于字符串进行排序。这与IP地址的结构无关。

答案 3 :(得分:0)

您可以通过多种方式对List进行排序,其他答案可以为其提供解决方案。但是,您应该退后一步,考虑一下您对列表的实际操作。

列表是原始类型,没有什么可以阻止任何人添加任何类型的对象。你总是使用泛型并避免使用原始类型。

List<String> addressList = new ArrayList<>();

答案 4 :(得分:0)

以下是使用Guava Ordering实用程序的解决方案:

addressList.sort(Comparator.comparing((String s) -> Arrays.asList(s.split("\\.")),
        Ordering.natural().<String>onResultOf(Integer::parseInt).lexicographical()));

答案 5 :(得分:0)

import java.util.*;
public class Main{
 public static void main(String[] args){
List<String> addressList = new ArrayList<String>();
addressList.add("192.1.1.100");
addressList.add("192.1.10.1");
addressList.add("192.100.10.1");
addressList.add("192.100.10.10");
Collections.sort(addressList,(a,b) ->{
    int[]aOct = Arrays.stream(a.split("\\.")).mapToInt(Integer:: parseInt).toArray();
    int[]bOct = Arrays.stream(b.split("\\.")).mapToInt(Integer:: parseInt).toArray();
    int r = 0;
    for (int i = 0; i<aOct.length && i< bOct.length; i++){
        if(r !=0){
            return r;
}}
    return r;
});
 System.out.println(addressList);
 }}