所以我正在创建一个使用数组链接列表数组的哈希表。让我花点时间解释一下为什么会这样。
所以我之前通过创建数组来实现哈希表,数组的每个元素都是一个链表。这样,我可以通过首先在数组中搜索哈希值,然后搜索该 LL 的元素来快速查找包含 450,000 个元素的 LL。我应该补充一点,这是一个学校项目,我不能只使用 java 附带的哈希表。
现在我想做类似的事情......但我有大量的数组需要搜索。这里,LL 的每个元素都是文本文件的行,由 4 元素数组表示,其中 4 个元素中的每一个都是在输入文件中以制表符分隔的不同字符串。我需要能够快速访问位于每行中的第二个、第三个和第四个字符串,它现在是该数组的一个元素。
所以我想要的是能够创建一个 LL 数组的数组...首先我会找到数组第二个元素的 ascii 值的总和。然后我将使用该值将整个数组散列到哈希表中。然后当我稍后需要找到这个元素时,我将转到数组的相应元素,其中我有一个数组列表。我将搜索列表中每个数组的第二个值。如果我找到我想要的,那么我返回该数组,并使用该数组的第三个和第四个元素。
正如我所说,对于 LL 数组,我可以正常工作,但是在内部添加数组的额外维度让我完全失望了。我认为这主要只是弄清楚语法,因为我已经成功初始化了 LL 数组的数组(public static LinkedList[] RdHashLL),所以看来 Java 原则上对此是可以接受的。但是,我不知道如何将元素放入哈希表中,以及如何将它们读出。
下面是我的链接列表数组的代码,运行良好。我只需要帮助让它适用于 LL OF 数组的数组!
public class TableOfHash{
public static LinkedList<String>[] HashLL;
//HASH FUNCTION - Finds sum of ascii values for string
public static int charSum(String s){
int hashVal = 0;
int size = 1019; //Prime Number around size of 8 char of 'z', (8 chars is amoung largest consistantly in dictionary)
for(int i = 0; i < s.length(); i++){
hashVal += s.charAt(i);
}
return hashVal % size;
}
//CREATE EMPTY HASH TABLE - Creates an array of LL
public static void makeHash(){
HashLL = new LinkedList[1019];
for(int i=0; i<HashLL.length; i++){
HashLL[i] = new LinkedList<String>();
}
}
//HASH VALUES INTO TABLE!
public static void dictionary2Hash(LinkedList<String> Dict){
for(String s : Dict){
HashLL[charSum(s)].add(s);
//Finds sum of char vales of dictionary element i,
//and then word at i to the HashLL at point defined
//by the char sum.
}
//Print out part of Hash Table (for testing! for SCIENCE!)
//System.out.println("HASH TABLE::");
//printHashTab();
}
//SEARCH HashTable for input word, return true if found
public boolean isWord(String s){
if(HashLL[charSum(s)].contains(s)){
wordsfound++;
return true;
}
return false;
}
}
我已经做了一些尝试来改变这一点,但是对于像 if(HashLL[charSum(s)].contains(s)) 这样的东西,它在 charsum(s) 返回的元素处搜索 LL...我没有想法当它是数组而不是字符串的 LL 时如何让它工作。我厌倦了 HashLL[charSum(s)].[1].contains(s)) 和 HashLL[charSum(s)][1].contains(s)) 以及其他各种东西。
Google 搜索“数组链接列表的数组”(带引号)结果为空,这一事实并没有帮助。
最后一点。我意识到可能有另一种数据结构可以实现我想要的功能,但除非您认为 LL 数组的数组是完全无望的原因,否则我想让它按原样工作。
最佳答案
如果你有
LinkedList<String[]>[] hashLL;
您可以像这样读取特定的字符串(多种方法之一)
String str = hashLL[outerArrayIndex].get(listIndex)[innerArrayIndex];
要写入字段,这是可能的(假设一切都正确初始化)。
String[] arr = hashLL[outerArrayIndex].get(listIndex);
arr[index] = "value";
关于java - 哈希表的数组链表数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13518039/