1 33 34 package edu.rice.cs.util; 35 import java.util.*; 36 37 public class BidirectionalHashMap<Type1, Type2> { 38 HashMap<Type1, Type2> forward = new HashMap<Type1, Type2>(); 39 HashMap<Type2, Type1> backward = new HashMap<Type2, Type1>(); 40 41 public void put(Type1 key, Type2 value) { 42 if (forward.containsKey(key)) { 43 throw new IllegalArgumentException ("Key " + key + " exists in hash already."); 44 } 45 if (forward.containsValue(value)) { 46 throw new IllegalArgumentException ("Double hashes must be one to one. " + value + " exists already in hash."); 47 } 48 forward.put(key, value); 49 backward.put(value, key); 50 } 51 52 public Type2 getValue(Type1 key) { return forward.get(key); } 53 54 public Type1 getKey(Type2 value) { return backward.get(value); } 55 56 public boolean containsKey(Type1 key) { return forward.containsKey(key); } 57 58 public boolean containsValue(Type2 value) { return backward.containsKey(value); } 59 60 public Iterator<Type2> valuesIterator() { return new BHMIterator(); } 61 62 public boolean isEmpty() { return forward.isEmpty(); } 63 64 65 public Collection<Type2> values() { return forward.values(); } 66 67 public Object [] valuesArray() { return values().toArray(); } public Type2[] valuesArray(Type2[] a) { return values().toArray(a); } 70 public Type2 removeValue(Type1 key) { 71 Type2 tmp = forward.remove(key); 72 backward.remove(tmp); 73 return tmp; 74 } 75 76 public Type1 removeKey(Type2 value) { 77 Type1 tmp = backward.remove(value); 78 forward.remove(tmp); 79 return tmp; 80 } 81 82 public int size() { return forward.size(); } 83 84 85 public void clear() { 86 forward = new HashMap<Type1, Type2>(); 87 backward = new HashMap<Type2, Type1>(); 88 } 89 90 public String toString() { 91 String ret = ""; 92 ret = "forward = " + forward.values() + "\nbackward = " + backward.values(); 93 return ret; 94 } 95 96 97 class BHMIterator implements Iterator<Type2> { 98 99 Iterator<Type2> forwardIt = forward.values().iterator(); 100 101 102 Type2 lastValue = null; 103 104 public boolean hasNext() { 105 return forwardIt.hasNext(); 106 } 107 108 public Type2 next() { 109 lastValue = forwardIt.next(); 110 return lastValue; 111 } 112 113 114 public void remove() { 115 forwardIt.remove(); 116 backward.remove(lastValue); 117 lastValue = null; 118 } 119 } 120 } 121 | Popular Tags |