Matthew Brzezinski
Matthew Brzezinski

Reputation: 1794

String HashTable Implementation

For my assignment we need to create a HashTable of Strings, I've created one using integers and it works perfectly, but I'm running into trouble now.

I keep getting java.lang.NumberFormatExceptions for my inputted Strings and I'm not sure why this is happening. Here's the code I am using for my HashTable class;

public class HashTable {
    private SortedList[] hashArray;
    private int arraySize;

    public HashTable(int size) {
        arraySize = size;
        hashArray = new SortedList[arraySize];

        for(int i = 0; i < arraySize; i++) {
            hashArray[i] = new SortedList();
        }
    } // END HashTable()

    public void displayTable() {
        for(int i = 0; i < arraySize; i++) {
            System.out.print(i + ". ");
            hashArray[i].displayList();
        }
    } // END displayTable()

    public int hash(String key) {
        int hashkey = Integer.parseInt(key);
        return hashkey % arraySize;
    } // END hash()

    public void insert(Link link) {
        String key = link.getKey();
        int hashVal = hash(key);
        hashArray[hashVal].insert(link);
    } // END insert()

    public void delete(String key) {
        int hashVal = hash(key);
        hashArray[hashVal].delete(key);
    } // END delete()
} // END HashTable

This is the code for the List:

public class SortedList {
    private Link first;

    public void SortedList() {
        first = null;
    } //END SortedList()

    public void insert(Link link) {
        String key = link.getKey();
        Link previous = null;
        Link current = first;

        while(current != null && key.compareTo(current.getKey()) > 0) {
            previous = current;
            current = current.getNext();
        }

        if(previous == null) {
            first = link;
        } else {
            previous.setNext(link);
            link.setNext(current);
        }
    } // END insert()

    public void delete(String key) {
        Link previous = null;
        Link current = first;

        while(current != null && !key.equals(current.getKey())) {
            previous = current;
            current = current.getNext();
        }

        if(previous == null) {
            first = first.getNext();
        } else {
            previous.setNext(current.getNext());
        }
    } // END delete()

    public Link find(String key) {
        Link current = first;

         while(current != null && current.getKey().compareTo(key) <= 0) {
            if(current.getKey().equals(key)) {
                 return current;
            }
            current = current.getNext();
        }
        return null;
    } // END find()

    public void displayList() {
        System.out.print("List (first -> last): ");
        Link current = first;
        while(current != null) {
            current.displayLink();
            current = current.getNext();
        }
        System.out.println();
    } // END displayList()
} //END SortedList()

The Link class is just a basic one, I get thrown the error on the line:

        int hashkey = Integer.parseInt(key);

In the hash function, in my HashTable class.

EDIT: From what I understand that I am being asked to do, I need to convert the String into an integer, and then perform the hash function to get the index for its position.

Upvotes: 1

Views: 1686

Answers (4)

Michael Lang
Michael Lang

Reputation: 3992

Because your link.getKey() and key variables in Hashtable.insert and Hashtable.delete allow all Strings to be passed. You should probably be using

public int hash(String key) {
    int hashkey = key.hashCode();
    return hashkey % arraySize;
} // END hash()

Upvotes: 3

Matt Ball
Matt Ball

Reputation: 359816

You're passing strings which aren't valid integer strings. As per the Integer#parseInt() JavaDoc:

Throws:

NumberFormatException - if the string does not contain a parsable integer.

Find a different way to turn a string into an integer. Hint: String#hashCode().

Upvotes: 1

sanbhat
sanbhat

Reputation: 17622

Looks like you are trying to convert a string into Integer here, where the string is not actually representing a number

 int hashkey = Integer.parseInt(key);

If you would like to get the hashcode for String key, you can simply call

int hashkey = key.hashCode();

Upvotes: 1

Joni
Joni

Reputation: 111239

To convert the String key into an integer for the purposes of use a hash key, use key.hashCode().

Upvotes: 1

Related Questions