1

对于我的任务,我们需要创建一个字符串哈希表,我已经使用整数创建了一个,它运行良好,但我现在遇到了麻烦。

我一直在获取java.lang.NumberFormatExceptions我输入的字符串,但我不确定为什么会这样。这是我用于 HashTable 类的代码;

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

这是列表的代码:

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()

Link 类只是一个基本类,我在线上抛出错误:

        int hashkey = Integer.parseInt(key);

在哈希函数中,在我的 HashTable 类中。

编辑:据我所知,我被要求做,我需要将字符串转换为整数,然后执行散列函数以获取其位置的索引。

4

4 回答 4

3

因为你的link.getKey()key变量在Hashtable.insert并且Hashtable.delete允许所有Strings被传递。您可能应该使用

public int hash(String key) {
    int hashkey = key.hashCode();
    return hashkey % arraySize;
} // END hash()
于 2013-07-15T15:52:59.657 回答
1

要将 转换String key为整数以使用哈希键,请使用key.hashCode().

于 2013-07-15T15:51:49.737 回答
1

看起来您正试图在此处将字符串转换为整数,其中字符串实际上并不代表数字

 int hashkey = Integer.parseInt(key);

如果您想获取 String 键的哈希码,您可以简单地调用

int hashkey = key.hashCode();
于 2013-07-15T15:51:52.677 回答
1

您传递的字符串不是有效的整数字符串。根据JavaDoc_Integer#parseInt()

抛出:

NumberFormatException- 如果字符串不包含可解析的整数。

找到一种不同的方法将字符串转换为整数。提示:String#hashCode()

于 2013-07-15T15:51:54.667 回答