1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.cosylab.util;
21
22 import java.util.HashSet;
23 import java.util.Iterator;
24
25
26
27
28
29
30 public class Iterators {
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 public static boolean areEqual(Iterator<? extends Object> iterA,
50 Iterator<? extends Object> iterB) {
51 if (iterA == null || iterB == null) {
52 throw new IllegalArgumentException();
53 }
54
55 HashSet<Object> setA = new HashSet<Object>();
56 HashSet<Object> setB = new HashSet<Object>();
57
58
59 while (iterA.hasNext()) {
60 setA.add(iterA.next());
61 }
62 while (iterB.hasNext()) {
63 setB.add(iterB.next());
64 }
65
66
67
68 if (setA.size() != setB.size()) {
69 return false;
70 }
71
72
73 iterA = setA.iterator();
74 while (iterA.hasNext()) {
75 if (!setB.contains(iterA.next())) {
76 return false;
77 }
78 }
79
80 return true;
81 }
82
83
84
85
86
87
88
89
90
91
92 public static boolean areEqualOrder(Iterator<? extends Object> iterA,
93 Iterator<? extends Object> iterB) {
94 if (iterA == null || iterB == null) {
95 throw new IllegalArgumentException();
96 }
97
98 while (iterA.hasNext()) {
99 if (!iterB.hasNext()) {
100 return false;
101 }
102
103 Object a = iterA.next();
104 Object b = iterB.next();
105
106 if (a == null) {
107 if (b != null) {
108 return false;
109 }
110 }
111
112 if (!a.equals(b)) {
113 return false;
114 }
115 }
116
117 if (iterB.hasNext()) {
118 return false;
119 }
120
121 return true;
122 }
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 public static <T> Iterator<T> intersect(Iterator<T> iterA, Iterator<T> iterB) {
143 final HashSet<Object> setA = new HashSet<Object>();
144 final Iterator<T> iterBFinal = iterB;
145 while (iterA.hasNext()) {
146 setA.add(iterA.next());
147 }
148 return new Iterator<T>() {
149 private T current;
150
151 {
152 moveToNext();
153 }
154
155 private void moveToNext() {
156 T tmp = null;
157 current = null;
158 while (iterBFinal.hasNext()) {
159 tmp = iterBFinal.next();
160 if (setA.contains(tmp)) {
161 current = tmp;
162 return;
163 }
164 }
165 }
166
167 public boolean hasNext() {
168 return current != null;
169 }
170
171 public T next() {
172 T result = current;
173 current = null;
174 moveToNext();
175 return result;
176 }
177
178 public void remove() {
179 throw new UnsupportedOperationException();
180 }
181 };
182 }
183
184
185
186
187
188
189
190
191
192
193 public static <T> Iterator<T> distinct(final Iterator<T> iter) {
194 return new Iterator<T>() {
195
196 private HashSet<T> elements = new HashSet<T>();
197
198
199 private T next = null;
200
201
202 {
203
204 goToNext();
205 }
206
207
208
209
210
211 public boolean hasNext() {
212 return next != null;
213 }
214
215
216
217
218
219 public T next() {
220 T result = next;
221 goToNext();
222 return result;
223 }
224
225
226
227
228
229 public void remove() {
230 throw new UnsupportedOperationException();
231 }
232
233
234
235
236 private void goToNext() {
237 while (iter.hasNext()) {
238 next = iter.next();
239 if (!elements.contains(next)) {
240 elements.add(next);
241 return;
242 }
243 }
244 next = null;
245 }
246 };
247 }
248 }
249
250