package com.raja.util;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class Hashtable {
private Object[] slots;
private int capacity;
Hashtable(int size) {
capacity = size;
slots = new String[size];
Arrays.fill(slots, "-1");
}
// Simple hash function that puts values in the randomly generated index that generated within the limits of the given Hashtable size
public void myHashFunction(Object[] elements, Object[] slots) {
Random random = new Random();
for (int n = 0; n < elements.length; n++) {
int randomIndex = randomIndex(0, capacity, random);
if(randomIndex < capacity){
while((String)slots[randomIndex] != "-1" && randomIndex != capacity){
randomIndex = randomIndex(0, capacity, random);
}
slots[randomIndex] = elements[n];
}
}
}
//Generates a random number in the limits of begin and end
private static int randomIndex(int begin, int end, Random aRandom){
if (begin > end) {
throw new IllegalArgumentException("Start cannot exceed End.");
}
long range = (long)end - (long)begin + 1;
long fraction = (long)(range * aRandom.nextDouble());
int randomNumber = (int)(fraction + begin);
if(randomNumber == end)
randomNumber--;
return randomNumber;
}
// Returns the value stored in the Hash slots
public Object getValue(int key) {
if(getKeys().contains(key)){
return slots[key];
} else return null;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("{ ");
for(int i = 0; i < slots.length; i++){
if(slots[i] != "-1")
sb.append(i+"->" + slots[i] + ", ");
}
sb.append("}");
int lastIndex = sb.lastIndexOf(",");
sb.replace(lastIndex, lastIndex + 1, "");
return sb.toString();
}
// Returns the key indexes where the elements got stored.
public Set<Integer> getKeys(){
Set<Integer> keys = new HashSet<Integer>();
if(slots != null){
for(int index = 0; index < slots.length; index++){
if(slots[index] != "-1"){
keys.add(index);
}
}
}
return keys;
}
//Testing : Storing A-Z alphabets in Hashtable
public static void main(String[] args) {
Object[] elements = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
Hashtable myHashtable = new Hashtable(1000); //Big size (i.e. 1000) is used to illustrate the random hash keys
myHashtable.myHashFunction(elements, myHashtable.slots);
System.out.println("Keys = "+ myHashtable.getKeys());
if(myHashtable.getKeys().size() != elements.length) {
System.out.println("Oops!, some element(s) were not stored in your hashtable");
}
System.out.println("Your Hashtable = " + myHashtable);
}
}
The output of this program would be something like:
Keys = [611, 954, 199, 406, 892, 25, 214, 633, 265, 391, 759, 102, 307, 236, 990, 36, 432, 918, 433, 40, 435, 522, 591, 775, 250, 726]
Your Hashtable = { 25->O, 36->S, 40->I, 102->H, 199->D, 214->N, 236->X, 250->Y, 265->K, 307->B, 391->F, 406->A, 432->M, 433->Q, 435->C, 522->V, 591->U, 611->G, 633->P, 726->J, 759->W, 775->R, 892->Z, 918->E, 954->T, 990->L }