java - 哈希表的数组链表数组

标签 java arrays linked-list hashtable

所以我正在创建一个使用数组链接列表数组的哈希表。让我花点时间解释一下为什么会这样。

所以我之前通过创建数组来实现哈希表,数组的每个元素都是一个链表。这样,我可以通过首先在数组中搜索哈希值,然后搜索该 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/

相关文章:

java - 如何将信息从一个类传递到另一个类

Java递归构建错误: array required,但找到字符串?

java - 如何从 java 调用带有一个或多个 INPUT 参数的 postgres 过程

c - 将格式化文本文件读入数组的语法,C

java - 为什么不能将 LinkedList 的最后一个节点设置为 null?

Java 错误 - "invalid method declaration; return type required"

c - 在 C 中,像 "a string"[4] 这样的东西究竟意味着什么?

javascript - JavaScript 数组中每个元素的大写偶数字符和小写奇数字符

c++ - 不确定如何使用迭代器在 C++ 中实现此插入方法

java - 使用递归将多项式相加