1 需求概述
实现对ipv4或者ipv6的排序。由于ipv4和ipv6无法比较大小,所以需要单独对ipv4和ipv6进行排序,然后分别存储在已经排好序的集合中。
2 实现
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.SortedSet;
import java.util.TreeSet;
public class IPUtil {
private static Long ipv4ToNumeric(String ip) {
Scanner sc = new Scanner(ip).useDelimiter("\\.");
Long restValue = (sc.nextLong() << 24) + (sc.nextLong() << 16) + (sc.nextLong() << 8) + (sc.nextLong());
sc.close();
return restValue;
}
private static BigInteger ipv6ToNumeric(String ip) {
BigInteger ipNum = null;
try {
ipNum = new BigInteger(1, InetAddress.getByName(ip).getAddress());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ipNum;
}
public static Map<String, SortedSet<String>> ipSort(List<String> ips) {
List<String> ipv4 = new ArrayList<>();
List<String> ipv6 = new ArrayList<>();
List<String> uncertain = new ArrayList<>();
Map<String, SortedSet<String>> restMap = new HashMap<>(3);
for (String ip : ips) {
if (ip.contains(":")) {
ipv6.add(ip);
} else if (ip.contains(".")) {
ipv4.add(ip);
} else {
System.out.println("不属于ipv4或者ipv6: " + ip);
uncertain.add(ip);
}
}
// ipv4排序
Comparator<String> ipv4Comparator = Comparator.comparing(IPUtil::ipv4ToNumeric);
SortedSet<String> rest_ipv4 = new TreeSet<>(ipv4Comparator);
rest_ipv4.addAll(ipv4);
System.out.println(rest_ipv4);
restMap.put("ipv4", rest_ipv4);
// ipv6排序
Comparator<String> ipv6Comparator = Comparator.comparing(IPUtil::ipv6ToNumeric);
SortedSet<String> rest_ipv6 = new TreeSet<>(ipv6Comparator);
rest_ipv6.addAll(ipv6);
System.out.println(rest_ipv6);
restMap.put("ipv4", rest_ipv6);
// 返回排序结果
return restMap;
}
}
import java.util.Arrays;
import java.util.List;
public class HelloWorld {
public static void main(String[] args) {
List<String> ips = Arrays.asList("192.168.0.1", "192.168.0.2", "192.168.0.9", "9.9.9.9",
"127.0.0.1", "192.168.0.90", "192.168.0.89", "192.168.0.8", "192.168.0.9", "192.163.0.9",
"::874C:2B35", "::874B:2B35", "::874B:2B34", "::874C:2B36");
IPUtil.ipSort(ips);
}
}
解释:先对列表中的所有ip进行分类,按照ipv4和ipv6进行分类,分别存入对应的列表中,然后分别对ipv4和ipv6进行排序,最后存到hashmap中返回。