为什么我不能在哈希表的链接列表数组中添加新条目?

时间:2019-04-09 09:27:18

标签: java algorithm linked-list hashtable

我正在尝试制作一个简单的哈希表以了解有关哈希的更多信息,并且我使用LinkedList数组来做到这一点。

以下是我正在使用的代码:

public class HashTable {

protected LinkedList<Entry>[] myTable;

  public HashTable(int capacity) {
    if(capacity < 0)
        throw new IllegalArgumentException();

    myTable = new LinkedList[capacity];
  }

  public void put(String key, Integer value) {
    int index = hash(key);
    //System.out.println(index);

    //if(myTable[index] == null) {
        myTable[index] = new LinkedList<Entry>();
        Entry entry = new Entry(key, value);
        myTable[index].add(entry);
    //}
  }

  public boolean containsKey(String key) {
    int index = hash(key);
    //System.out.println(index);

    for(Entry e : myTable[index]) {
        System.out.println(e.getKey()); // to check which entries are stored
        if(e.getKey().equals(key)) {
            return true;
        }
        }

    return false;
  }

  public Integer get(String key) {
      int index = hash(key);
       //System.out.println(index);

    for(Entry entry : myTable[index]) {
        if(entry.getKey().equals(key)){
            return entry.getValue();
        }
    }

    return null;
  }


  public int getCapacity() {
    return myTable.length;
  }


  public int hash(String item) {
      return item.hashCode()%(this.getCapacity());
  }


  public static void main(String[] args) {
      HashTable hashTable = new HashTable(10);
      hashTable.put("something", 20);
      hashTable.put("new", 21);
      hashTable.put("amazing", 100);

      System.out.println(hashTable.containsKey("something"));
  }

}

对于上述输入,我得到以下输出:

  

惊人的
  错误

我无法弄清楚为什么我不能在索引处向链接列表添加新条目。对于上述输入,我只在索引0处存储一个条目,而对其他输入则不存储。

我将不胜感激。

2 个答案:

答案 0 :(得分:0)

您正在为哈希表的每个新条目创建一个新列表。相反,如果索引的列表不存在,则应该创建一个新列表;如果该列表存在,则应该追加到列表中。

使用以下代码将元素放入哈希表。

public class HashTable {

protected LinkedList<Entry>[] myTable;

  public HashTable(int capacity) {
    if(capacity < 0)
        throw new IllegalArgumentException();

    myTable = new LinkedList[capacity];
  }

  public void put(String key, Integer value) {
    int index = hash(key);
    //System.out.println(index);

    if(myTable[index] == null) {
        myTable[index] = new LinkedList<Entry>();
    }
    Entry entry = new Entry(key, value);
    myTable[index].add(entry);

  }

  public boolean containsKey(String key) {
    int index = hash(key);
    //System.out.println(index);

    for(Entry e : myTable[index]) {
        System.out.println(e.getKey()); // to check which entries are stored
        if(e.getKey().equals(key)) {
            return true;
        }
        }

    return false;
  }

  public Integer get(String key) {
      int index = hash(key);
       //System.out.println(index);

    for(Entry entry : myTable[index]) {
        if(entry.getKey().equals(key)){
            return entry.getValue();
        }
    }

    return null;
  }


  public int getCapacity() {
    return myTable.length;
  }


  public int hash(String item) {
      return item.hashCode()%(this.getCapacity());
  }


  public static void main(String[] args) {
      HashTable hashTable = new HashTable(10);
      hashTable.put("something", 20);
      hashTable.put("new", 21);
      hashTable.put("amazing", 100);

      System.out.println(hashTable.containsKey("something"));
  }

}
  

hashCode()方法也将生成负值。

访问哈希表时(即使用myTable [index]时),您将获得ArrayIndexOutOfBoundsExcception。

要使用负索引,请使用

public int hash(String item) {
      return Math.abs(item.hashCode()%(this.getCapacity()));
}

答案 1 :(得分:0)

将您的哈希码更新到下面。它应该工作。

  public int hash(String item) {
    return (this.getCapacity() - 1) & item.hashCode();
  }

在这里,我们使用键和表容量的实际哈希码进行按位 AND 操作。这将确保表容量的内部界限。

注意::可能为多个密钥生成相同的哈希。您需要详细说明处理这种情况的逻辑。