多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合并的功能了~

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