// Hash Table: using String keys, with the java String method hashCode() import java.util.*; interface Map { public int size(); public boolean isEmpty(); public Object get(String k); public Object put(String k, Object v); public Object remove(String k); } class Pair { public String key; public Object value; Pair(String k, Object v) { key = k; value = v; } } class ChainedHashTable implements Map { int size; int capacity; Vector bucket[]; ChainedHashTable() { this(1000); } ChainedHashTable(int cap) { capacity = cap; bucket = new Vector[cap]; size = 0; for (int i = 0; i < cap; i++) bucket[i] = null; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public Object get(String k){ int h = k.hashCode() % capacity; if (bucket[h] != null) { for (int i = 0; i < bucket[h].size(); i++) { Pair p = (Pair) bucket[h].get(i); if (p.key.equals(k)) return p.value; } } return null; } public Object put(String k, Object v) { int h = k.hashCode() % capacity; if (bucket[h] == null) bucket[h] = new Vector(); for (int i = 0; i < bucket[h].size(); i++) { Pair p = (Pair) bucket[h].get(i); if (p.key.equals(k)) { Object answer = p.value; p.value = v; return answer; } } bucket[h].add(new Pair(k, v)); size ++; return null; } public Object remove(String k) { int h = k.hashCode() % capacity; if (bucket[h] != null) { for (int i = 0; i < bucket[h].size(); i++) { Pair p = (Pair) bucket[h].get(i); if (p.key.equals(k)) { bucket[h].remove(i); size --; return p.value; } } } return null; } public void dump() { for (int i = 0; i < capacity; i++) { if (bucket[i] != null) { System.out.print("" + i + ": "); for (int j = 0; j < bucket[i].size(); j++) { Pair p = (Pair) bucket[i].get(j); System.out.print("(" + p.key + " " + p.value + ") "); } System.out.println(); } } } public static void main(String args[]) { Map m = new ChainedHashTable(4); testMap(m); } public static void testMap(Map m) { boolean done = false; while (!done) { try { Scanner sc = new Scanner(System.in); System.out.println("\ncmds are + - D F Q: >>"); String cmd = sc.next(); String key = null; String value = null; char command = cmd.charAt(0); if (command != 'Q' && command != 'D') key = sc.next(); if (command == '+') value = sc.next(); switch (cmd.charAt(0)) { case 'Q': done = true; value = null; break; case 'D': value = null; ((ChainedHashTable) m).dump(); break; case '+': value = (String) m.put(key, value); break; case '-': value = (String) m.remove(key); break; case 'F': value = (String) m.get(key); break; } if (value != null) System.out.println("Value: " + value); } catch (Exception e) { System.out.println("Error " + e.toString()); } } } }