/* * Copyright 2011 Uwe Krueger. * * 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 com.mandelsoft.swing; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; /** * * @author Uwe Krüger */ public class IntervalList implements Iterable<Interval2D> { private List<Interval2D> list=new ArrayList<Interval2D>(); public IntervalList() { } public IntervalList(Interval2D iv) { this(); add(iv); } public IntervalList(Collection<Interval2D> l) { this(); for (Interval2D iv:l) add(iv); } public IntervalList(IntervalList l) { this(); for (Interval2D iv:l) add(iv); } public Iterator<Interval2D> iterator() { return list.iterator(); } public void add(Interval2D a) { Interval2D next=null; int in=0; int i; for (i=0; i<list.size(); i++) { Interval2D iv=list.get(i); if (iv.getMax()>=a.getMin()) { next=iv; // first potentially involved in=i; break; } } if (next==null) { list.add(a); } else { // join Interval2D end=null; int ie=list.size(); for (i=in; i<list.size(); i++) { Interval2D iv=list.get(i); if (iv.getMin()>a.getMax()) { ie=i; break; } end=iv; } Interval2D n=new Interval2D(next.getMin()<a.getMin()?next.getMin(): a.getMin(), end==null?a.getMax():end.getMax()); list.add(ie, n); while (ie-->in) list.remove(in); } } public void sub(Interval2D a) { Interval2D next=null; int in=0; int i; for (i=0; i<list.size(); i++) { Interval2D iv=list.get(i); if (iv.getMax()>=a.getMin()) { next=iv; // first potentially involved in=i; break; } } if (next!=null) { if (next.getMin()<a.getMin()) { list.add(in++,new Interval2D(next.getMin(),a.getMin())); } for (; next!=null && next.getMax()<=a.getMax();) { list.remove(in); next=in<list.size()?list.get(in):null; } if (next!=null && next.getMin()<a.getMax()) { list.remove(in); list.add(in,new Interval2D(next.getMax(),a.getMax())); } } } @Override public String toString() { StringBuilder sb=new StringBuilder(); for (Interval2D iv:list) { sb.append("["); sb.append(iv.getMin()); sb.append("-"); sb.append(iv.getMax()); sb.append("]"); } return sb.toString(); } //////////////////////////////////////////////////////////////////////// public static void main(String[] args) { IntervalList list=new IntervalList(); Interval2D i1=new Interval2D(3,4); list.add(i1); System.out.println("a: "+list); i1=new Interval2D(11,20); list.add(i1); System.out.println("b: "+list); i1=new Interval2D(6,8); list.add(i1); System.out.println("c: "+list); i1=new Interval2D(1,2); list.add(i1); System.out.println("d: "+list); i1=new Interval2D(2,3); list.add(i1); System.out.println("e: "+list); i1=new Interval2D(2,11); list.add(i1); System.out.println("f: "+list); //// i1=new Interval2D(6,8); list.sub(i1); System.out.println("sa: "+list); i1=new Interval2D(10,12); list.sub(i1); System.out.println("sb: "+list); i1=new Interval2D(5,9); list.sub(i1); System.out.println("sc: "+list); i1=new Interval2D(0,2); list.sub(i1); System.out.println("sd: "+list); i1=new Interval2D(2,3); list.sub(i1); System.out.println("se: "+list); i1=new Interval2D(19,21); list.sub(i1); System.out.println("sf: "+list); i1=new Interval2D(15,19); list.sub(i1); System.out.println("sg: "+list); i1=new Interval2D(4,13); list.sub(i1); System.out.println("sh: "+list); i1=new Interval2D(0,20); list.sub(i1); System.out.println("si: "+list); } }