我有此实现用于插入到使用顺序链接的哈希表中:

public void insert(String word, Definition definition) {

       int hash = hashFunction(word);


        if (table[hash] == null) {
            EntryImplSub chainedEntry = new EntryImplSub(null);
            chainedEntry.addDefinition(definition);
            chainedEntry.setWord(word);

            table[hash] = chainedEntry;
            numProbes++;
            entries++;

        }

        else{

            EntryImplSub chainedEntry = new EntryImplSub(table[hash]);
            chainedEntry.addDefinition(definition);
            chainedEntry.setWord(word);

            table[hash] = chainedEntry;
            numProbes++;
            }

      }


本质上,我正在尝试制作字典。有一个EntryImpl类充当条目对象,并且每个条目都有一个单词和定义(或多个定义)。现在,我做了一个新的扩展类EntryImplSub,该类打算被链接。这个新类具有getNext()方法,并从常规EntryImpl类继承所有其他功能。 EntryImplSub构造函数用于设置下一个。



但是,这不起作用。当我加载大量单词时,并不会全部输入。我不确定为什么。

我的尝试

我的实现逻辑是,如果表条目为null,则插入一个新的EntryImplSub对象,其next = null,然后设置单词和定义。

但是,如果我们要插入的位置已经有一个单词,那么我们必须将新条目添加到列表的开头。因此,我们创建了一个新的EntryImplSub对象,并将下一个属性设置为表中已有的属性。然后,为新的EntryImplSub设置单词,并将其插入表中。因此,我们应该具有EntryImplSub的链接列表。

我真的不知道为什么这个工作。我花了数小时试图找到错误,任何帮助将不胜感激。让我知道您是否需要任何澄清。

非常感谢!

编辑

这是检查表中是否有条目的代码

 public List<Definition> getDefinitions(String word) {

    int hash = hashFunction(word);
    //ChainedEntry head = table[hash];
    while (table[hash] != null) {
        numSearches++;

        if (((EntryImpl) table[hash]).getWord().equals(word)) {
            return ((EntryImpl) table[hash]).getDefinitions();
        }
        table[hash] = table[hash].getNext();
    }

    return null;
}


如果返回null,则单词不在表中

最佳答案

我将简化这样的代码并编写一个简短的单元测试。这很可能需要2-3个条目才能重现该问题,这很可能是您未显示的代码中的问题。

public void insert(String word, Definition definition) {
   int hash = 0; // put everything in one bucket for now // hashFunction(word);

    if (table[hash] == null)
        entries++;

    EntryImplSub chainedEntry = new EntryImplSub(table[hash]);
    chainedEntry.addDefinition(definition);
    chainedEntry.setWord(word);

    table[hash] = chainedEntry;
    numProbes++;
}


由于word无法更改,因此我将其设为构造函数参数(以及final字段)

关于java - 使用链接对象的HashTable实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30011559/

10-09 04:10