Hash table with double hashing
import java.io.IOException; public class HashTableWithDoubleHashing { private DataItem[] hashArray; private int arraySize; private DataItem bufItem; // for deleted items HashTableWithDoubleHashing(int size) { arraySize = size; hashArray = new DataItem[arraySize]; bufItem = new DataItem(-1); } public void displayTable() { System.out.print("Table: "); for (int j = 0; j < arraySize; j++) { if (hashArray[j] != null) System.out.print(hashArray[j].getKey() + " "); else System.out.print("** "); } System.out.println(""); } public int hashFunc1(int key) { return key % arraySize; } public int hashFunc2(int key) { return 6 - key % 6; } public void insert(int key, DataItem item) { int hashVal = hashFunc1(key); // hash the key int stepSize = hashFunc2(key); // get step size // until empty cell or -1 while (hashArray[hashVal] != null && hashArray[hashVal].getKey() != -1) { hashVal += stepSize; // add the step hashVal %= arraySize; // for wraparound } hashArray[hashVal] = item; // insert item } public DataItem delete(int key) { int hashVal = hashFunc1(key); int stepSize = hashFunc2(key); // get step size while (hashArray[hashVal] != null) { if (hashArray[hashVal].getKey() == key) { DataItem temp = hashArray[hashVal]; // save item hashArray[hashVal] = bufItem; // delete item return temp; // return item } hashVal += stepSize; // add the step hashVal %= arraySize; // for wraparound } return null; // can't find item } public DataItem find(int key) { int hashVal = hashFunc1(key); // hash the key int stepSize = hashFunc2(key); // get step size while (hashArray[hashVal] != null) { if (hashArray[hashVal].getKey() == key) return hashArray[hashVal]; // yes, return item hashVal += stepSize; // add the step hashVal %= arraySize; // for wraparound } return null; // can't find item } public static void main(String[] args) throws IOException { int aKey; DataItem aDataItem; int size, initSize; size = 100; initSize = 10; HashTableWithDoubleHashing theHashTable = new HashTableWithDoubleHashing( size); for (int i = 0; i < initSize; i++) { aKey = (int) (java.lang.Math.random() * 2 * size); aDataItem = new DataItem(aKey); theHashTable.insert(aKey, aDataItem); } theHashTable.displayTable(); aKey = 100; aDataItem = new DataItem(aKey); theHashTable.insert(aKey, aDataItem); aKey = 100; theHashTable.delete(aKey); aKey = 100; aDataItem = theHashTable.find(aKey); if (aDataItem != null) System.out.println("Found " + aKey); else System.out.println("Could not find " + aKey); } } class DataItem { private int data; public DataItem(int i) { data = i; } public int getKey() { return data; } }