package jds.collection;
import java.util.NoSuchElementException;
import java.util.Enumeration;
import jds.Bag;
import jds.Indexed;
/**
* OpenHashtable - collection stored using open address hashing;
* for use with book
* Classic Data Structures
* in Java
* by Timothy A Budd,
* published by Addison-Wesley, 2001.
*
* @author Timothy A. Budd
* @version 1.1 September 1999
*/
public class OpenHashtable implements Bag {
Indexed elementData;
int elementCount = 0;
// contructors
/**
* initialize newly created hash table
*
* @param size number of buckets in the initial table
*/
public OpenHashtable (int size)
{ elementData = new Vector(); elementData.setSize(size); }
/**
*
*/
public OpenHashtable (Indexed ed)
{ elementData = ed; }
// the Collection interface
public boolean isEmpty () { return elementCount == 0; }
public int size () { return elementCount; }
public Enumeration elements ()
{ return new OpenHashtableEnumerator(); }
// the Bag interface
public void addElement (Object val) {
// make certain we have room for element
if (elementCount + 1 >= elementData.size()) reAdjustTable();
// then add to table
int index = Math.abs(val.hashCode()) % elementData.size();
while (elementData.elementAt(index) != null)
if (++index >= elementData.size()) index = 0;
elementData.setElementAt(val, index);
elementCount++;
}
public boolean containsElement (Object val) {
int index = Math.abs(val.hashCode()) % elementData.size();
while (elementData.elementAt(index) != null) {
if (val.equals(elementData.elementAt(index)))
return true;
if (++index >= elementData.size()) index = 0;
}
return false;
}
public Object findElement (Object val) {
int index = Math.abs(val.hashCode()) % elementData.size();
while (elementData.elementAt(index) != null) {
if (val.equals(elementData.elementAt(index)))
return elementData.elementAt(index);
if (++index >= elementData.size()) index = 0;
}
throw new NoSuchElementException(val.toString());
}
public void removeElement (Object val) {
throw new NoSuchElementException(val.toString());
}
private void reAdjustTable () {
Indexed oldTable = elementData;
elementData = new Vector();
elementData.setSize(oldTable.size() * 2);
elementCount = 0;
for (int i = 0; i < oldTable.size(); i++) {
Object val = oldTable.elementAt(i);
if (val != null) addElement(val);
}
}
private class OpenHashtableEnumerator implements Enumeration {
private int index = -1;
public boolean hasMoreElements () {
while (++index < elementData.size()) {
if (elementData.elementAt(index) != null)
return true;
}
return false;
}
public Object nextElement () { return elementData.elementAt(index); }
}
}