多IP地址集合的合併

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章