import SimpleMap; class HashTable implements SimpleMap { private int chains; // Size of table. chains= maxN/5 private HashNode[] heads; // Ref to 1st object in chain private int actual; // No of objects in table public HashTable(int c) { chains= c; heads= new HashNode[chains]; // Initialized to nulls actual= 0; } public int tableSize() { // Returns no of chains, not no of objects in hash table return chains; } public int dataSize() { return actual; } public Object get(Object k) { if (k== null) return null; int index= Math.abs(k.hashCode()) % chains; // Simple version HashNode curr= heads[index]; while (curr != null) { if (curr.key.equals(k)) return curr.value; curr= curr.next; } return null; } public Object put(Object k, Object v) { if (k==null || v==null) return null; int index= Math.abs(k.hashCode()) % chains; // Simple; rehash for better performance HashNode curr= heads[index]; while (curr != null) { if (curr.key.equals(k)) break; curr = curr.next; } if (curr == null) { actual++; heads[index]= new HashNode(k, v, heads[index]); return null; } else { Object ret = curr.value; curr.value = v; return ret; } } public Object remove(Object k) { if (k== null) return null; int index = Math.abs(k.hashCode()) % chains; HashNode curr= heads[index]; // Simple version HashNode prev= null; while (curr != null ) { if (curr.key.equals(k)) { actual--; // Are we removing the head of chain if ( prev == null ) heads[index] = curr.next; else prev.next = curr.next; return curr.value; } prev= curr; curr= curr.next; } return null; } public void clear() { for (int i=0; i < chains; i++) heads[i]= null; } } class HashNode { Object value; // Package scope Object key; // Package scope HashNode next; // Package scope public HashNode(Object k, Object v, HashNode t) { key= k; value= v; next= t; } }