package misc; // This is the same as MultiHashMap. Only difference is // that LinkedList has been replaced by HashSet. // Clean this up at some point and use a generic to // reduce duplication. import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; public class HashMapOfSets { public HashMap<Object, HashSet<Object>> hashMap = new HashMap<Object, HashSet<Object>>(); public Iterator<Entry<Object, HashSet<Object>>> getEntrySetIterator() { return hashMap.entrySet().iterator(); } public Iterator<Object> getKeySetIterator() { return hashMap.keySet().iterator(); } public void add(Object key, Object val) { HashSet<Object> valList = hashMap.get(key); if (valList == null) { valList = new HashSet<Object>(); hashMap.put(key, valList); } valList.add(val); } public void addHashMapOfSets(HashMapOfSets otherHashMap) { Set<Entry<Object, HashSet<Object>>> entrySet = otherHashMap.hashMap .entrySet(); Iterator<Entry<Object, HashSet<Object>>> it = entrySet.iterator(); while (it.hasNext()) { Entry<Object, HashSet<Object>> pair = it.next(); Iterator<Object> it2 = pair.getValue().iterator(); while (it2.hasNext()) { add(pair.getKey(), it2.next()); } } } public void remove(Object key, Object val) { HashSet<Object> dstList = hashMap.get(key); if (dstList == null) return; dstList.remove(val); } public void removeAllForKey(Object key) { hashMap.put(key, new HashSet<Object>()); } public int size() { int s = 0; Set<Entry<Object, HashSet<Object>>> entrySet = hashMap.entrySet(); Iterator<Entry<Object, HashSet<Object>>> it = entrySet.iterator(); while (it.hasNext()) { Entry<Object, HashSet<Object>> pair = it.next(); s += pair.getValue().size(); } return s; } public HashSet<Object> getListForKey(Object k) { return hashMap.get(k); } }