All pastes #963963 Raw Edit

Untitled

public text v1 · immutable
#963963 ·published 2008-03-30 22:55 UTC
rendered paste body


import java.util.LinkedList;
import java.util.Iterator;

public class MonsterHashTable {
	
	private LinkedList<KeyValuePair> ll[];
	private int bucketElements[];
	private KeyValuePair data[][];
	private int loadFactor;
	private int bucketSize;
	
	//create an index from the hash code of the key
	private int getIndexFromKey(Object key) {		
		return Math.abs(key.hashCode() % data.length);
	}
	
	//search a bucket to the end, and then search the list
	private Comparable searchBucketWithList(int index, Object key) {
		Comparable obj = searchBucket(index, bucketSize, key);
		KeyValuePair kvp = null;
		Iterator<KeyValuePair> itr = null;
		if(obj == null) {
			itr = ll[index].iterator();
			while(itr.hasNext()) {
				kvp = itr.next();
				if(key.equals(kvp.getKey()))
					obj = kvp.getValue();
			}
		}
		return obj;
	}
	
	//search a bucket to the specified index
	private Comparable searchBucket(int index, int maxBucket, Object key) {	
		KeyValuePair kvp = null;
		for(int i = 0; i < maxBucket; i++) {
			kvp = data[index][i];
			if(key.equals(kvp.getKey())) {
				return kvp.getValue();
			}
		}
		return null;
	}
	
	//search a bucket to the number of elements it contains
	private Comparable searchBucket(int index, Object key) {
		int numElements = bucketElements[index];
		return searchBucket(index, numElements, key);	
	}
	
	//find a key in a bucket
	private Comparable find(int index, Object key) {
		if(bucketElements[index] <= bucketSize)
			return searchBucket(index, key);
		else
			return searchBucketWithList(index, key);		
	}
	
	/**
	 * 
	 * @param numberBuckets the number of buckets
	 * @param bucketSize the size of each bucket
	 * @param loadFactor percentage of buckets to be filled for a reorganize
	 */
	public MonsterHashTable(int numberBuckets, int bucketSize, int loadFactor) {
		data 			= new KeyValuePair[numberBuckets][bucketSize];
		bucketElements 	= new int[numberBuckets];
		ll				= new LinkedList[numberBuckets];
		this.bucketSize = bucketSize;
		this.loadFactor = loadFactor;
	}
	
	
	private void addToList(int index, KeyValuePair kvp) {
		if(ll[index] == null)
			ll[index] = new LinkedList<KeyValuePair>();
		if(searchBucketWithList(index, kvp.getKey()) == null) {
			ll[index].add(kvp);
			bucketElements[index]++;
		}
	}
	
	private void addToBucket(int index, KeyValuePair kvp) {	
		if(searchBucket(index, kvp.getKey()) == null) {
			data[index][bucketElements[index]] = kvp;
			bucketElements[index]++;
		}
	}
	
	/**
	 * 
	 * @param key
	 * @param value
	 */
	public void add(Object key, Comparable value) {
		KeyValuePair kvp = new KeyValuePair(key, value);
		int index = getIndexFromKey(key);
		
		if(bucketElements[index] < bucketSize)
			addToBucket(index, kvp);
		else
			addToList(index, kvp);
	}
	
	/**
	 * 
	 * @param key
	 * @return
	 */
	public Comparable get(Object key) {
		return find(getIndexFromKey(key), key);
	}
	
	
	/**
	 * 
	 * @return
	 */
	public SortedIterator iterator() {
		
	}
	
	/**
	 * 
	 * @return
	 */
	public int numberCollisions() {
		
	}
	
	/**
	 * 
	 * @return
	 */
	public int numberOperations() {
		
	}
	
	
	/**
	 * 
	 * @param key
	 * @return
	 */
	public Comparable remove(Object key) {
		int index = getIndexFromKey(key);
		
	}
	
	/**
	 * 
	 * @param numberBuckets
	 * @param bucketSize
	 * @param loadFactor
	 */
	void reorganize(int numberBuckets, int bucketSize, int loadFactor) {
		
	}
	
	/**
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public Comparable replace(Object key, Comparable value) {
		
	}
	
	/**
	 * 
	 * @return
	 */
	public String structureReport() {
		String str = "";
		for(int i = 0; i < data.length; i++) {
			for(int j = 0; j < bucketSize; j++) {
				if(data[i][j] != null) {
					str += "[" + data[i][j].getValue() + "] ";
				}	
				else
					str += "[ ] ";
			}
			if(ll[i] != null) {
				Iterator<KeyValuePair> itr = ll[i].iterator();
				str += ": ";
				while(itr.hasNext()) {
					str += " -> ";
					str += itr.next().getValue();
				}
			}
			str += "\n";
		}
		return str;
	}
}