0

そのため、配列のリンク リストの配列を使用するハッシュ テーブルを作成しています。その理由を説明します。

そのため、以前に配列を作成してハッシュ テーブルを実装しました。配列の各要素はリンク リストです。このようにして、配列内で最初にハッシュ値を検索し、この LL の要素を検索することで、450,000 要素の LL をすばやく検索できました。これは学校向けのプロジェクトであり、Java に付属のハッシュ テーブルをそのまま使用することはできません。

今、私は似たようなことをしたいと思っています...しかし、私は検索する必要がある配列のLLを大量に持っています。ここで、LL の各要素はテキスト ファイルの行であり、4 つの要素の配列で表されます。4 つの要素のそれぞれは、入力ファイルでタブで区切られた異なる文字列です。各行に配置されていた 2 番目、3 番目、4 番目の文字列にすばやくアクセスできるようにする必要があり、それがこの配列の要素になりました。

だから私が欲しいのは、配列のLLの配列を作成できるようにすることです...最初に、配列の2番目の要素のASCII値の合計を見つけます。次に、この値を使用して配列全体をハッシュ テーブルでハッシュします。その後、後でこの要素を見つける必要が生じたときに、配列のリストがある配列の対応する要素に移動します。リスト内の各配列の 2 番目の値を検索します。必要なものが見つかったら、その配列を返し、この配列の 3 番目と 4 番目の要素を使用します。

私が言ったように、私はこれを LL の配列に対してうまく機能させていますが、内部に配列の余分な次元を追加すると、私は完全に脱落しました。配列の LL の配列 (public static LinkedList[] RdHashLL) を正常に初期化したので、Java は原則としてこれで問題ないように見えるので、ほとんどの場合は構文を理解するだけだと思います。ただし、要素をハッシュテーブルに入れる方法と、それらを読み取る方法がわかりません。

以下は、正常に機能するリンクされたリストの配列のコードです。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;
}

}

これを変更しようといくつか試みましたが、charsum(s) によって返された要素で LL を検索する if(HashLL[charSum(s)].contains(s)) のようなものについては...どうすればよいかわかりません文字列ではなく配列の LL である場合に動作するようにします。HashLL[charSum(s)].[1].contains(s)) や HashLL[charSum(s)][1].contains(s)) など、いろいろ疲れました。

「Array of Linked Lists of Arrays」(引用符付き) の Google 検索が空になるという事実は、役に立ちませんでした。

最後のビット。私が望むことを行う別のデータ構造があるかもしれないことは理解していますが、配列の LL の配列がまったく絶望的な原因であると思わない限り、そのまま機能させたいと思います。

4

1 に答える 1

1

あなたが持っている場合

LinkedList<String[]>[] hashLL;

このように特定の文字列を読み取ることができます(多くの方法の1つ)

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

フィールドに書き込むために、これは可能です (すべてが正しく初期化されていると仮定します)。

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