blob: 80005e63770e2fe4443e00efd64d669d775c0f28 [file] [log] [blame]
package org.unicode.cldr.util;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
public class SimpleEquivalenceClass {
@SuppressWarnings({ "unchecked", "rawtypes" })
public SimpleEquivalenceClass(Comparator c) {
comparator = c;
itemToSet = new TreeMap(c);
}
@SuppressWarnings("rawtypes")
private Map itemToSet;
@SuppressWarnings("rawtypes")
private Comparator comparator;
@SuppressWarnings({ "rawtypes", "unchecked" })
public void add(Object a, Object b) {
if (a == b) {
throw new InternalError("Err! a is b!");
}
Set sa = (Set) itemToSet.get(a);
Set sb = (Set) itemToSet.get(b);
if (sa == null && sb == null) { // new set!
Set s = new TreeSet(comparator);
s.add(a);
s.add(b);
itemToSet.put(a, s);
itemToSet.put(b, s);
} else if (sa == null) {
sb.add(a);
} else if (sb == null) {
sa.add(b);
} else { // merge sets, dumping sb
sa.addAll(sb);
Iterator it = sb.iterator();
while (it.hasNext()) {
itemToSet.put(it.next(), sa);
}
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private class MyIterator implements Iterator {
private Iterator it;
MyIterator(Comparator comp) {
if (comp == null)
it = itemToSet.values().iterator();
else {
TreeSet values = new TreeSet(comp);
values.addAll(itemToSet.values());
it = values.iterator();
}
}
public boolean hasNext() {
return it.hasNext();
}
public Object next() {
return it.next();
}
public void remove() {
throw new IllegalArgumentException("can't remove");
}
}
public Iterator<Set<String>> getSetIterator(Comparator comp) {
return new MyIterator(comp);
}
public String toString() {
return itemToSet.values().toString();
}
}