java guava TreeRangeSet实现插入一个不重复的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边理了下思路 奋斗

三、代码走起

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;
	}

}

四、运行结果


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值