我正在尝试制作一个简单的哈希表以了解有关哈希的更多信息,并且我使用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处存储一个条目,而对其他输入则不存储。
我将不胜感激。
答案 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 操作。这将确保表容量的内部界限。
注意::可能为多个密钥生成相同的哈希。您需要详细说明处理这种情况的逻辑。