/* * JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jef.common.wrapper; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import jef.common.Range; import jef.tools.StringUtils; /** * 描述由多个IntRange构成的拼合区间 * @author Administrator * */ public class IntRangeGroup implements Range<Integer>,Iterable<Integer>{ private static final long serialVersionUID = -348521088168327290L; IntRange[] ranges; public IntRangeGroup(IntRange... range){ this.ranges=range; } public Integer getGreatestValue() { if(ranges.length==0){ throw new IllegalArgumentException("the range is nothing."); } int max=ranges[0].getGreatestValue(); for(int i=1;i<ranges.length;i++){ IntRange r=ranges[i]; if(r.getGreatestValue()>max){ max=r.getGreatestValue(); } } return max; } public Integer getLeastValue() { if(ranges.length==0){ throw new IllegalArgumentException("the range is nothing."); } int min=ranges[0].getLeastValue(); for(int i=1;i<ranges.length;i++){ IntRange r=ranges[i]; if(r.getGreatestValue()<min){ min=r.getGreatestValue(); } } return min; } public boolean isContinuous() { for(int i=1;i<ranges.length;i++){ IntRange a=ranges[i]; boolean isAConnectToAnyOhter=false; for(int j=0;j<i;j++){ IntRange b=ranges[j]; if(b.contains(a.getStart())|| b.contains(a.getEnd())){//说明区间A和区间B的相连的。 isAConnectToAnyOhter=true; break; } } //只要发现任意一个区间和其他区间是不相连的,那整个区间组就是不连续的。 if(!isAConnectToAnyOhter)return false; } return true; } public boolean contains(Integer obj) { for(IntRange r: ranges){//任意一个区间包含指定值,就是true if(r.contains(obj))return true; } return false; } public Iterator<Integer> iterator() { return new Iterator<Integer>(){ Iterator<IntRange> iter=Arrays.asList(ranges).iterator(); Iterator<Integer> now=null; public boolean hasNext() { boolean flag=iter.hasNext(); if(now==null)return flag; return flag||now.hasNext(); } public Integer next() { if(now==null || !now.hasNext()){ now=iter.next().iterator(); } return now.next(); } public void remove() { throw new UnsupportedOperationException(); } }; } public static IntRangeGroup getInstance(String rangeStr){ String[] args=StringUtils.split(rangeStr,','); List<IntRange> rangs=new ArrayList<IntRange>(); for(String arg:args){ arg=arg.trim(); int start; int end; if(arg.indexOf('-')>-1){ start=StringUtils.toInt(StringUtils.substringBefore(arg, "-"), 0); end=StringUtils.toInt(StringUtils.substringAfter(arg, "-"), 0); }else{ start=StringUtils.toInt(arg, 0); end=start; } IntRange i=new IntRange(start,end); if(!tryMerge(rangs,i)){ rangs.add(i); } } return new IntRangeGroup(rangs.toArray(new IntRange[rangs.size()])); } private static boolean tryMerge(List<IntRange> rangs, IntRange i) { // for(IntRange range:rangs){ // // } return false; } }