source: josm/trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java @ 5241

Revision 5170, 2.5 KB checked in by Don-vip, 7 weeks ago (diff)

cleanup svn:mime-type properties preventing Java sources from being viewed as such on Trac

  • Property svn:eol-style set to native
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.tools;
3
4import java.util.AbstractCollection;
5import java.util.Collection;
6import java.util.Iterator;
7
8/**
9 * Filtered view of a collection.
10 * (read-only collection, but elements can be changed, of course)
11 * Lets you iterate through those elements of a given collection that satisfy a
12 * certain condition (imposed by a predicate).
13 * @param <S> element type of the underlying collection
14 * @param <T> element type of filtered collection (and subclass of S). The predicate
15 *      must accept only objects of type T.
16 */
17public class SubclassFilteredCollection<S, T extends S> extends AbstractCollection<T> {
18
19    private final Collection<? extends S> collection;
20    private final Predicate<? super S> predicate;
21    int size = -1;
22
23    private class FilterIterator implements Iterator<T> {
24
25        private final Iterator<? extends S> iterator;
26        private S current;
27
28        public FilterIterator(Iterator<? extends S> iterator) {
29            this.iterator = iterator;
30        }
31
32        private void findNext() {
33            if (current == null) {
34                while (iterator.hasNext()) {
35                    current = iterator.next();
36                    if (predicate.evaluate(current))
37                        return;
38                }
39                current = null;
40            }
41        }
42
43        public boolean hasNext() {
44            findNext();
45            return current != null;
46        }
47
48        public T next() {
49            findNext();
50            S old = current;
51            current = null;
52            // we are save because predicate only accepts objects of type T
53            @SuppressWarnings("unchecked") T res = (T) old;
54            return res;
55        }
56
57        public void remove() {
58            throw new UnsupportedOperationException();
59        }
60    }
61
62    public SubclassFilteredCollection(Collection<? extends S> collection, Predicate<? super S> predicate) {
63        this.collection = collection;
64        this.predicate = predicate;
65    }
66
67    @Override
68    public Iterator<T> iterator() {
69        return new FilterIterator(collection.iterator());
70    }
71
72    @Override
73    public int size() {
74        if (size == -1) {
75            size = 0;
76            Iterator<T> it = iterator();
77            while (it.hasNext()) {
78                size++;
79                it.next();
80            }
81        }
82        return size;
83    }
84
85    @Override
86    public boolean isEmpty() {
87        return !iterator().hasNext();
88    }
89
90}
Note: See TracBrowser for help on using the repository browser.