1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.archive.util.iterator;
26
27 import java.util.ArrayList;
28 import java.util.Iterator;
29 import java.util.NoSuchElementException;
30
31 /***
32 * An iterator that's built up out of any number of other iterators.
33 * @author gojomo
34 */
35 public class CompositeIterator implements Iterator {
36 ArrayList<Iterator> iterators = new ArrayList<Iterator>();
37 Iterator currentIterator;
38 int indexOfCurrentIterator = -1;
39
40 /***
41 * Moves to the next (non empty) iterator. Returns false if there are no
42 * more (non empty) iterators, true otherwise.
43 * @return false if there are no more (non empty) iterators, true otherwise.
44 */
45 private boolean nextIterator() {
46 if (++indexOfCurrentIterator < iterators.size()) {
47 currentIterator = (Iterator) iterators.get(indexOfCurrentIterator);
48
49 return hasNext();
50 } else {
51 currentIterator = null;
52 return false;
53 }
54 }
55
56
57
58
59 public boolean hasNext() {
60 if(currentIterator!=null && currentIterator.hasNext()) {
61
62 return true;
63 } else {
64
65 return nextIterator();
66 }
67 }
68
69
70
71
72 public Object next() {
73 if(hasNext()) {
74 return currentIterator.next();
75 } else {
76 throw new NoSuchElementException();
77 }
78 }
79
80
81
82
83 public void remove() {
84 throw new UnsupportedOperationException();
85 }
86
87 /***
88 * Create an empty CompositeIterator. Internal
89 * iterators may be added later.
90 */
91 public CompositeIterator() {
92 super();
93 }
94
95 /***
96 * Convenience method for concatenating together
97 * two iterators.
98 * @param i1
99 * @param i2
100 */
101 public CompositeIterator(Iterator i1, Iterator i2) {
102 this();
103 add(i1);
104 add(i2);
105 }
106
107 /***
108 * Add an iterator to the internal chain.
109 *
110 * @param i an iterator to add.
111 */
112 public void add(Iterator i) {
113 iterators.add(i);
114 }
115
116 }