有这么一个需求:判断两组IP是否包含相同的IP值。IP组表示为单个IP和IP段的组合,比如
10.1.1.3,10.1.2.4-10.1.2.10,10.1.2.20-10.1.2.30
现在需要判断这种格式的两组IP是否包含了相同的IP值,只要有一个相同的IP值就行。比如1.1.1.3和1.1.1.1-1.1.1.4就包含了一个相同的IP 1.1.1.3。
为了比较的方便,首先我们要把IP格式化一下,把1.1.1.3变成 001.001.001.003,也就是把一个IP中每个部分都变成3位,不到3位的左边补上0。然后每个IP组分成单个IP和IP段的List,再分别拿一个IP组的单个IP或者IP段和另一个IP组比较。
代码如下:
public static boolean hasSameIp(String ip1, String ip2) {
String[] ips1 = ip1.split(",");
String[] ips2 = ip2.split(",");
for (int i = 0 ; i < ips1.length ; i++) {
String[] parts = ips1[i].split("\\-");
format(parts);
if (parts.length == 1) {
ips1[i] = parts[0];
} else {
ips1[i] = parts[0] + "-" + parts[1];
}
}
for (int i = 0 ; i < ips2.length ; i++) {
String[] parts = ips2[i].split("\\-");
format(parts);
if (parts.length == 1) {
ips2[i] = parts[0];
} else {
ips2[i] = parts[0] + "-" + parts[1];
}
}
for (String _ip1 : ips1) {
if (_ip1.contains("-")) {
if (hasSameIp2(_ip1.substring(0, _ip1.indexOf("-")), _ip1.substring(_ip1.indexOf("-")+1), ips2)) {
return true;
}
} else if (hasSameIp1(_ip1, ips2)) {
return true;
}
}
for (String _ip2 : ips2) {
if (_ip2.contains("-")) {
if (hasSameIp2(_ip2.substring(0, _ip2.indexOf("-")), _ip2.substring(_ip2.indexOf("-")+1), ips1)) {
return true;
}
} else if (hasSameIp1(_ip2, ips1)) {
return true;
}
}
return false;
}
private static boolean hasSameIp2(String ip1, String ip2, String[] ips) {
return hasSameIp1(ip1, ips) || hasSameIp1(ip2, ips);
}
private static boolean hasSameIp1(String ip, String[] ips) {
for (String _ip : ips) {
if (_ip.contains("-")) {
String ip1 = _ip.substring(0, _ip.indexOf("-"));
String ip2 = _ip.substring(_ip.indexOf("-")+1);
if (ip.equals(ip1) || ip.equals(ip2)) {
return true;
}
if (ip.compareTo(ip1) > 0 && ip.compareTo(ip2) < 0) {
return true;
}
} else if (_ip.equals(ip)) {
return true;
}
}
return false;
}
private static void format(String[] parts) {
for (int i = 0 ; i < parts.length ; i++) {
String[] a = parts[i].split("\\.");
for (int j = 0 ; j < a.length ; j++) {
a[j] = " "+a[j];
a[j] = a[j].substring(a[j].length() - 3);
}
parts[i] = a[0] + "." + a[1] + "." + a[2] + "." + a[3];
}
}
然后写测试代码:
System.out.println("1 "+hasSameIp("1.1.1.3", "1.1.1.3"));
System.out.println("2 "+hasSameIp("1.1.1.3", "1.1.1.1-2.1.1.4"));
System.out.println("3 "+hasSameIp("1.1.1.3", "1.1.1.3-1.1.1.4"));
System.out.println("4 "+hasSameIp("1.1.1.3,1.1.1.8", "1.1.1.6-1.1.1.10"));
System.out.println("5 "+hasSameIp("1.1.1.3,1.1.1.8", "1.1.1.3,1.1.1.9-1.1.1.10"));
System.out.println("6 "+hasSameIp("1.1.1.3-1.1.1.4,1.1.1.8", "1.1.1.3,1.1.1.9-1.1.1.10"));
System.out.println("7 "+hasSameIp("1.1.1.3-1.1.1.4,1.1.1.8", "1.1.1.1-1.1.1.6"));
System.out.println("8 "+hasSameIp("1.1.1.3-1.1.1.5,1.1.1.8", "1.1.1.4-1.1.1.6"));
这些应该全部返回true。