KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > uk > co > jezuk > mango > iterators > BoundedIterator


1 package uk.co.jezuk.mango.iterators;
2
3 /**
4  * A <code>BoundedIterator</code> enumerates of a subset of a collection, in the
5  * range [<code>start</code>, <code>end</code>). A normal <code>java.util.Iterator</code>
6  * traverses [0, collection.size()), so BoundedIterator allows you
7  * to pick out a sub-set without using <code>list.subList()</code>
8  * or equivalent.
9  *
10  * @author Jez Higgins, jez@jezuk.co.uk
11  * @version $Id: BoundedIterator.java 49 2002-06-11 14:43:09Z jez $
12  */

13 public class BoundedIterator implements java.util.Iterator JavaDoc
14 {
15   /**
16    * This form of <code>BoundedIterator</code> limits the range traversed by the
17    * underlying <code>iterator</code>. <p>
18    * If <code>iterator.hasNext()</code> fails before <code>end</code> is
19    * reached, the traversal will stop prematurely.<p>
20    * @throws java.lang.IndexOutOfBoundsException if start<0, end<0 or start>end
21    */

22   public BoundedIterator(java.util.Iterator JavaDoc iterator, int start, int end)
23   {
24     iter_ = new iteratorWrapper(iterator, start, end);
25   } // BoundIterator
26

27   /**
28    * The form of <code>BoundedIterator</code> uses indexed access directly into
29    * the list.<p>
30    * If <code>end</code> > list.end() the travesal will stop with
31    * list.end() is reached.<p>
32    * For <code>ArrayLists</code> and <code>Vectors</code> it
33    * should be slightly quicker. For <code>LinkedLists</code> it
34    * will be slower.
35    * @throws java.lang.IndexOutOfBoundsException if start<0, end<0 or start>end
36    */

37   public BoundedIterator(java.util.List JavaDoc list, int start, int end)
38   {
39     iter_ = new listIterator(list, start, end);
40   } // BoundedIterator
41

42   public boolean hasNext()
43   {
44     return iter_.hasNext();
45   } // hasNext
46

47   public Object JavaDoc next()
48   {
49     return iter_.next();
50   } // next
51

52   public void remove()
53   {
54     iter_.remove();
55   } // remove
56

57   private java.util.Iterator JavaDoc iter_;
58
59   ///////////////////////////////////////////////////
60
static private void checkConstraints(int start, int end)
61   {
62     if(start < 0)
63       throw new IndexOutOfBoundsException JavaDoc("start < 0");
64     if(end < 0)
65       throw new IndexOutOfBoundsException JavaDoc("end < 0");
66     if(start > end)
67       throw new IndexOutOfBoundsException JavaDoc("start > end");
68   } // checkConstraints
69

70   static private class iteratorWrapper implements java.util.Iterator JavaDoc
71   {
72     iteratorWrapper(java.util.Iterator JavaDoc iterator, int start, int end)
73     {
74       BoundedIterator.checkConstraints(start, end);
75
76       iter_ = iterator;
77       for(index_ = 0; iter_.hasNext() && index_ < start; ++index_, iter_.next())
78     ;
79
80       end_ = iter_.hasNext() ? end : index_;
81     } // iteratorWrapper
82

83     public boolean hasNext()
84     {
85       end_ = iter_.hasNext() ? end_ : index_;
86       return (index_ < end_);
87     } // hasNext()
88

89     public Object JavaDoc next()
90     {
91       ++index_;
92       return iter_.next();
93     } // next
94

95     public void remove()
96     {
97       iter_.remove();
98     } // remove
99

100     private java.util.Iterator JavaDoc iter_;
101     private int index_;
102     private int end_;
103   } // iteratorWrapper
104

105   static private class listIterator implements java.util.Iterator JavaDoc
106   {
107     listIterator(java.util.List JavaDoc list, int start, int end)
108     {
109       BoundedIterator.checkConstraints(start, end);
110
111       list_ = list;
112       index_ = start;
113       end_ = end;
114
115       if(end_ > list_.size())
116     end_ = list.size();
117     } // listIterator
118

119     public boolean hasNext()
120     {
121       return (index_ < end_);
122     } // hasNext
123

124     public Object JavaDoc next()
125     {
126       return list_.get(index_++);
127     } // next
128

129     public void remove()
130     {
131       list_.remove(index_ - 1);
132     } // remove
133

134     private java.util.List JavaDoc list_;
135     private int index_;
136     private int end_;
137   } // listIterator
138
} // BoundedIterator
139
Popular Tags