用于哈希表的数组的链接列表数组

时间:2012-11-22 18:06:46

标签: java arrays linked-list hashtable

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

所以我之前通过创建一个Array实现了Hash Tables,并且该数组的每个元素都是一个Linked List。通过这种方式,我可以通过在数组中首先搜索哈希值并搜索此LL的元素来快速查找450,000个元素的LL。我应该补充一点,这是一个学校项目,我不能只使用java附带的哈希表。

现在我想做类似的事情......但是我需要搜索一个LL数组。这里LL的每个元素都是一个文本文件的行,由4个元素数组表示,其中4个元素中的每一个都是在输入文件中以制表符分隔的不同字符串。我需要能够快速访问位于每一行的第2,第3和第4个字符串,现在这是该数组的一个元素。

所以我想要的是能够创建一个LL of Arrays数组...首先我会找到数组第二个元素的ascii值之和。然后我将使用此值将整个数组哈希到哈希表中。然后,当我稍后需要找到这个元素时,我将转到数组的相应元素,其中我有一个数组列表。我将搜索列表中每个数组的第二个值。如果我找到了我想要的那个,那么我将返回该数组,并使用该数组的第3和第4个元素。

正如我所说,我对一个LL数组工作正常,但在内部添加额外的Arrays维度已经完全抛弃了我。我认为它主要只是搞清楚语法,因为我已经成功初始化了一个LL of Arrays数组(公共静态LinkedList [] RdHashLL)所以看起来Java原则上是可以接受的。但是,我不知道如何将元素放入哈希表中,以及如何将它们读出来。

以下是我的代码,其中列出了一系列有效的LINKED LISTS。我只是需要帮助才能让它成为ARRAY OF LL OF ARRAYS!

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))以及其他各种各样的东西。

谷歌搜索“数组链接列表”(带引号)空白的事实并没有帮助。

最后一点。我意识到可能有另一种数据结构能够满足我的需要,但除非你认为数组LL数组是一个完全无望的原因,否则我想让它按原样运行。

1 个答案:

答案 0 :(得分:1)

如果你有

LinkedList<String[]>[] hashLL;

你可以读取这样的特定字符串(多种方式之一)

String str = hashLL[outerArrayIndex].get(listIndex)[innerArrayIndex];

要写入字段,这是可能的(假设所有内容都已正确初始化)。

String[] arr = hashLL[outerArrayIndex].get(listIndex);
arr[index] = "value";