一、网友的问题描述
我要插入一个IP段 比如:10.10.10.7-10.10.10.65,但是不能和数据库中的IP段重复, 最终我想要的结果是:10.10.10.11-10.10.10.29和10.10.10.51-10.10.10.65被插入到数据库
二、解决思路
解决这个问题的思路可以用数学里面的区间来实现,我们知道ip地址最后一位的范围一般都为[0,255],于是就可以用区间的交集来处理。很巧的是,前一阶段刚刚了解了一下google的开源jar包guava-18.0.jar,里面貌似就有处理这种问题的类Range、RangeSet,于是就边查API边理了下思路
![奋斗](http://static.blog.csdn.net/xheditor/xheditor_emot/default/struggle.gif)
三、代码走起
package com.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import com.google.common.collect.TreeRangeSet;
public class InsertNewIp {
public static void main(String[] args) {
//已经存在的ip,从数据库中查出来的
List<String> ipList=new LinkedList<String>();
ipList.add("10.10.10.30-10.10.10.50");
ipList.add("10.10.10.2-10.10.10.10");
ipList.add("10.10.10.80-10.10.10.101");
RangeSet<Integer> IpRangeSet=createIpRangeSet(ipList);
System.out.println("数据库中已有的ip段:"+ipList);
//处理要插入的ip范围
System.out.println("需要插入的ip段为:"+"10.10.10.7-10.10.10.65");
RangeSet<Integer> newIpRangeSet=createNewIpRange("10.10.10.7-10.10.10.65",IpRangeSet);
//转为List,保存到数据库中,需要先删除数据库中原有的ip段,再重新插入list
List<String> newIpList=createIpRangeList(newIpRangeSet);
System.out.println("处理后数据库中应该保存的ip段为(需要先删除数据库中原有的ip段,再把list插入数据库中,这样可以节省数据库的存储空间):\n"+newIpList);
}
/**
* 把List结构的ip转为RangeSet
* @param ipList
* @return
*/
public static RangeSet<Integer> createIpRangeSet(List<String> ipList){
RangeSet<Integer> currentIps=TreeRangeSet.create();
String[] tempData=null;
for(String ip:ipList){
tempData= ip.split("[\\-\\.]");
currentIps.add(Range.closed(Integer.parseInt(tempData[3]),Integer.parseInt(tempData[7])));
}
return currentIps;
}
/**
* 添加后参数新的ip范围
* @param newIpRange
* @return
*/
public static RangeSet<Integer> createNewIpRange(String ipRange, RangeSet<Integer> currentIps){
String[] tempData=ipRange.split("[\\-\\.]");
Range<Integer> newIpRange=Range.closed(Integer.parseInt(tempData[3]), Integer.parseInt(tempData[7]));
currentIps.add(newIpRange);
return currentIps;
}
/**
* 把RangeSet结构的ip转为List
* @param ipRangeSet
* @return
*/
public static List<String> createIpRangeList(RangeSet<Integer> ipRangeSet){
Set<Range<Integer>> ranges=ipRangeSet.asRanges();
Iterator<Range<Integer>> iterator=ranges.iterator();
Range<Integer> tempRange=null;
List<String> result=new ArrayList<String>();
String initStr="10.10.10.";
while(iterator.hasNext()){
tempRange=iterator.next();
result.add(initStr+tempRange.lowerEndpoint()+"-"+initStr+tempRange.upperEndpoint());
}
return result;
}
}