2 **********************************************************************
3 * Copyright (c) 2002-2012, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 **********************************************************************
7 **********************************************************************
8 */package com.ibm.icu.dev.util;
10 import java.util.Collection;
11 import java.util.Comparator;
12 import java.util.HashSet;
13 import java.util.Iterator;
16 import java.util.TreeMap;
19 * A collection that is like a sorted set, except that it allows
20 * multiple elements that compare as equal
23 // TODO replace use of Set with a collection that takes an Equator
24 public class SortedBag implements Collection {
26 * A map of sets, where each corresponds to one sorted element.
27 * The sets are never empty
32 public SortedBag(Comparator c) {
35 public boolean add(Object s) {
36 Set o = (Set)m.get(s);
41 boolean result = o.add(s);
45 public Iterator iterator() {
46 return new MyIterator();
48 static Iterator EMPTY_ITERATOR = new HashSet().iterator();
49 private class MyIterator implements Iterator {
50 private Iterator mapIterator = m.keySet().iterator();
51 private Iterator setIterator = null;
53 private MyIterator() {
54 mapIterator = m.keySet().iterator();
55 setIterator = getSetIterator();
57 private Iterator getSetIterator() {
58 if (!mapIterator.hasNext()) return EMPTY_ITERATOR;
59 return ((Set)m.get(mapIterator.next())).iterator();
61 public boolean hasNext() {
62 return setIterator.hasNext() || mapIterator.hasNext();
64 public Object next() {
65 if (!setIterator.hasNext()) {
66 setIterator = getSetIterator();
68 return setIterator.next();
70 public void remove() {
71 throw new UnsupportedOperationException();
83 public boolean isEmpty() {
86 public boolean contains(Object o) {
87 Set set = (Set)m.get(o);
88 if (set == null) return false;
89 return set.contains(o);
91 public Object[] toArray() {
92 return toArray(new Object[size]);
94 public Object[] toArray(Object[] a) {
96 for (Iterator it = iterator(); it.hasNext();) {
97 a[count++] = it.next();
102 * @see java.util.Collection#remove(java.lang.Object)
104 public boolean remove(Object o) {
105 Set set = (Set)m.get(o);
106 if (set == null) return false;
107 if (!set.remove(o)) return false;
108 if (set.size() == 0) m.remove(o);
112 public boolean containsAll(Collection c) {
113 for (Iterator it = c.iterator(); it.hasNext(); ) {
114 if (!contains(it.next())) return false;
118 public boolean addAll(Collection c) {
119 boolean result = false;
120 for (Iterator it = c.iterator(); it.hasNext(); ) {
121 if (add(it.next())) result = true;
125 public boolean removeAll(Collection c) {
126 boolean result = false;
127 for (Iterator it = c.iterator(); it.hasNext(); ) {
128 if (remove(it.next())) result = true;
132 public boolean retainAll(Collection c) {
133 // WARNING: this may not work if the comparator does not distinguish
134 // all items that are equals().
135 Set stuffToRemove = new HashSet(); // have to do this since iterator may not allow removal!
136 for (Iterator it = iterator(); it.hasNext(); ) {
137 Object item = it.next();
138 if (!c.contains(item)) stuffToRemove.add(item);
140 return removeAll(stuffToRemove);