java实现插入一个不重复的IP段
一、网友的问题描述
我要插入一个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边理了下思路
三、代码走起
1 package com.test; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.LinkedList; 6 import java.util.List; 7 import java.util.Set; 8 9 import com.google.common.collect.Range; 10 import com.google.common.collect.RangeSet; 11 import com.google.common.collect.TreeRangeSet; 12 13 public class InsertNewIp { 14 15 public static void main(String[] args) { 16 17 //已经存在的ip,从数据库中查出来的 18 List<String> ipList=new LinkedList<String>(); 19 ipList.add("10.10.10.30-10.10.10.50"); 20 ipList.add("10.10.10.2-10.10.10.10"); 21 ipList.add("10.10.10.80-10.10.10.101"); 22 23 RangeSet<Integer> IpRangeSet=createIpRangeSet(ipList); 24 System.out.println("数据库中已有的ip段:"+ipList); 25 //处理要插入的ip范围 26 System.out.println("需要插入的ip段为:"+"10.10.10.7-10.10.10.65"); 27 RangeSet<Integer> newIpRangeSet=createNewIpRange("10.10.10.7-10.10.10.65",IpRangeSet); 28 //转为List,保存到数据库中,需要先删除数据库中原有的ip段,再重新插入list 29 List<String> newIpList=createIpRangeList(newIpRangeSet); 30 System.out.println("处理后数据库中应该保存的ip段为(需要先删除数据库中原有的ip段,再把list插入数据库中,这样可以节省数据库的存储空间):\n"+newIpList); 31 32 } 33 /** 34 * 把List结构的ip转为RangeSet 35 * @param ipList 36 * @return 37 */ 38 public static RangeSet<Integer> createIpRangeSet(List<String> ipList){ 39 RangeSet<Integer> currentIps=TreeRangeSet.create(); 40 String[] tempData=null; 41 for(String ip:ipList){ 42 tempData= ip.split("[\\-\\.]"); 43 currentIps.add(Range.closed(Integer.parseInt(tempData[3]),Integer.parseInt(tempData[7]))); 44 } 45 return currentIps; 46 } 47 48 /** 49 * 添加后参数新的ip范围 50 * @param newIpRange 51 * @return 52 */ 53 public static RangeSet<Integer> createNewIpRange(String ipRange, RangeSet<Integer> currentIps){ 54 String[] tempData=ipRange.split("[\\-\\.]"); 55 Range<Integer> newIpRange=Range.closed(Integer.parseInt(tempData[3]), Integer.parseInt(tempData[7])); 56 currentIps.add(newIpRange); 57 return currentIps; 58 } 59 /** 60 * 把RangeSet结构的ip转为List 61 * @param ipRangeSet 62 * @return 63 */ 64 public static List<String> createIpRangeList(RangeSet<Integer> ipRangeSet){ 65 Set<Range<Integer>> ranges=ipRangeSet.asRanges(); 66 Iterator<Range<Integer>> iterator=ranges.iterator(); 67 Range<Integer> tempRange=null; 68 List<String> result=new ArrayList<String>(); 69 String initStr="10.10.10."; 70 while(iterator.hasNext()){ 71 tempRange=iterator.next(); 72 result.add(initStr+tempRange.lowerEndpoint()+"-"+initStr+tempRange.upperEndpoint()); 73 } 74 return result; 75 } 76 77 }
四、运行结果


浙公网安备 33010602011771号