客户要求:希望有个工具方法,可以将一个集合中的IP地址进行合并,例如:"1.1.1.1","1.1.1.2","1.1.1.3"可以合并成"1.1.1.1~3"
按照客户要求来说,算是比较简单的,前三位相同且后一位在顺序的情况下进行合并,并用~隔开。
由于我在网上只找到了根据IP进行排序的方法,所以合并这部分就只能自己来写了~ 用简单的字符串截取及逻辑判断做到。
以下是效果图:
详细代码如下:
/*
* 获取
*/
public static List<String> getIp(List<String> ipList){
//排序
List<String> sortList = ipSort(ipList);
List<String> ips = new ArrayList<>();
Map<String, String> map = new HashMap<String, String>();
//去重并拼接
for (String ip : sortList) {
String fristIp = ip.substring(0, ip.lastIndexOf("."));
String lastIp = ip.substring(ip.lastIndexOf(".") + 1);
if (map.containsKey(fristIp)) {
String value = map.get(fristIp) + "," + lastIp;
map.put(fristIp, value);
} else {
map.put(fristIp, lastIp);
}
}
//判断数相邻之间是否差1,是则合并
for (Map.Entry<String, String> m : map.entrySet()) {
List<String> lastIps = ipMerge(m.getValue());
for (String lastIp : lastIps) {
ips.add(m.getKey() + "." + lastIp);
}
}
return ips;
}
排序的方法如下:
public static List<String> ipSort(List<String> ipList){
List<String> ips = new ArrayList<String>();
Set<String> ipSet = new TreeSet<String>();
for (String ip : ipList) {
//补0
ip = ip.replaceAll("(\\d+)", "00$1");
//截取后3位
ip = ip.replaceAll("0*(\\d{3})", "$1");
ipSet.add(ip);
}
for (String ip : ipSet) {
ips.add(ip.replaceAll("0*(\\d+)", "$1"));
}
return ips;
}
ip合并的方法如下:
public static List<String> ipMerge (String value) {
String lastIp [] = value.split(",");
List<String> mergeIps = new ArrayList<>();
String splicing = null;
for (int i = 0; i < lastIp.length; i++) {
if (i < lastIp.length -1) {
//判断相邻数相减是否为1
if (Integer.valueOf(lastIp[i+1]) - Integer.valueOf(lastIp[i]) == 1) {
//多个数之间相减皆为1则拼接splicing
splicing = (null != splicing && splicing.contains("~"))
?(splicing.split("~")[0] + "~" + lastIp[i+1]):(lastIp[i] + "~" + lastIp[i+1]);
} else {
if (null != splicing) {
mergeIps.add(splicing);
//重置拼接
splicing = null;
} else {
mergeIps.add(lastIp[i]);
}
}
} else {
//若最后一个数在前一个合并中则不存,若不在则单独存最后一个数
mergeIps.add((null != splicing && splicing.contains(lastIp[i]))?splicing:lastIp[i]);
}
}
return mergeIps;
}
总体来说就是先排序,保证ip地址的最后以为是顺序的,然后用字符串截取的形式获取前三位一样的ip后以为数字的集合,然后把该集合处理合并,最后再拼接回去,这样就完成了多IP合并的功能了~