我应该从头开始制作Hashtable,它应该是一系列链接列表。我必须创建自己的Linked List类(在我的代码中),以及我自己的列中的项目(DataItem,在代码中)。
我的add(word)功能需要帮助。我应该在使用我的哈希函数找到的索引处将一个DataItem添加到链表的数组中(我可以很好地获得索引)。
我把我的代码放在下面。一切都没有错误,添加方法"工作"但它没有实现我制作的Linked List类。而不是仅仅将dataitem放入每个索引的数组中,我应该放置链表的第一个链接,并将dataitem放在那里。当发生碰撞时(比如当我添加carkcel时),我应该将它添加到链接列表中的下一个链接。我能帮忙解决这个问题吗?我根本不知道如何使用链接列表。
import java.util.*;
public class HashTable{
private int tableSize = 97;
//the LinkedList class I made
public class LinkedList {
private LinkedList next;
private final DataItem word;
public LinkedList(DataItem word, LinkedList next) {
this.word = word;
this.next = next;
}
}
public class DataItem {
String word;
int count; // occurrence count of this word
public DataItem(String word) {
this.word = word;
this.count = 1;
}
}
/*A constructor, which takes no parameters and creates an empty hash table.*/
DataItem[] table = new DataItem[97];
//My hash function.
public int hash(String word){
int index = 0;
for(int i = 0;i < word.length(); i++){
index += word.charAt(i) - 'a' + 1;
}
index = (((17 + word.length()) + index) * 17) % tableSize;
return index;
}
/*This method must search for word in the hash table, if it finds word,
it must increment the word’s occurrence count; if it does not find the word,
it must insert it into the hash table, giving it an initial occurrence count of 1.*/
public void add(String word){
//convert word to all lowercase
word = word.toLowerCase();
int index = hash(word);
System.out.println("adding " + word + " at index " + index);
DataItem newItem = new DataItem(word);
//search for the word at the index location's linked list.
//if we don't find the word, add it to the beginning of the linked list;
if(table[index] == null){
table[index] = newItem;
System.out.println(table[index]);
return;
}
//if we find the word, increment the word's count.
if(table[index] != null){
if(table[index].word == word){
table[index].count += 1;
System.out.println(table[index]);
return;
}
//if the word at index is different, add the new word to the next link in the linked list
if(table[index].word != word){
System.out.println("collision!");
return;
}
}
}
当我运行我的测试程序时:
import java.util.*;
public class test {
public static void main(String[] args) {
HashTable table = new HashTable();
table.add("snap");
table.add("crackle");
table.add("pop");
table.add("pop");
table.add("carkcel");
}
}
我明白了:
在索引43处添加快照&#39; snap&#39;,1
在指数48处加入裂纹&#39;裂缝&#39;,1
在索引72添加pop&#39; pop&#39;,1
在索引72添加pop&#39; pop&#39;,2
在指数48碰撞时添加carkcel!
答案 0 :(得分:0)
您正在尝试将值分配给数组索引,而不是将其添加到该数组索引中的链接列表中:好吧,我无法看到您在哪里创建了一个链表列表,但我假设您在表中有链接列表阵列。
if(table[index] == null){
table[index] = newItem;
System.out.println(table[index]);
return;
}
你应该像这样调用链表的add方法:
if(table[index].get() == null){
table[index].add(newItem);
System.out.println(table[index]);
return;
}
此算法称为单独链接。你可以在这里找到它是如何工作的一本书Kevin Wayne & Robert Sedgewick.你也可以在youtube上找到关于它的视频,这是我推荐你的原因。
以下是在数组中创建链接列表的方法:
for(int i = 0; i < table.length;i++){
table[i] = new LinkedList(null,null);
}
在此之后,您可以使用索引调用add和get方法。