客戶要求:希望有個工具方法,可以將一個集合中的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合併的功能了~