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 }

四、运行结果

 

posted @ 2016-11-30 17:03  梦蓝蓝的  阅读(376)  评论(0)    收藏  举报