そのため、配列のリンク リストの配列を使用するハッシュ テーブルを作成しています。その理由を説明します。
そのため、以前に配列を作成してハッシュ テーブルを実装しました。配列の各要素はリンク リストです。このようにして、配列内で最初にハッシュ値を検索し、この 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 の配列がまったく絶望的な原因であると思わない限り、そのまま機能させたいと思います。