0

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

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

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

所以我想要的是能够创建一个 LL of Arrays 的数组......首先我会找到数组第二个元素的 ascii 值的总和。然后我将使用这个值将整个数组散列到哈希表中。然后当我以后需要找到这个元素时,我会去数组的对应元素,那里有一个数组列表。我将搜索列表中每个数组的第二个值。如果我找到我想要的,那么我返回那个数组,并使用这个数组的第三和第四个元素。

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

下面是我的链接列表数组的代码,可以正常工作。我只需要帮助让它适用于 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)) 以及其他各种东西。

Google 搜索“数组的链接列表”(带引号)显示为空的事实并没有帮助。

最后一点。我意识到可能还有另一种数据结构可以满足我的要求,但除非您认为 LL of Arrays 的 Array 是完全没有希望的原因,否则我想让它按原样工作。

4

1 回答 1

1

如果你有

LinkedList<String[]>[] hashLL;

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

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

要写入字段,这是可能的(假设一切都已正确初始化)。

String[] arr = hashLL[outerArrayIndex].get(listIndex);
arr[index] = "value";
于 2012-11-22T18:15:53.770 回答