2012-11-22 71 views
0

所以我創建了一個使用數組鏈表的數組哈希表。讓我花一秒鐘來解釋這是爲什麼。哈希表數組鏈表的鏈表陣列

所以我以前通過創建一個數組來實現哈希表,並且數組的每個元素都是一個鏈表。通過這種方式,我可以通過首先在數組中搜索哈希值並搜索此LL的元素來快速查找450,000個元素的LL。我應該補充說,這是一個學校項目,我不能只使用Java附帶的哈希表。

現在我想要做類似的事情......但我有很多LL需要搜索的陣列。這裏LL的每個元素都是一個文本文件的行,由4個元素的數組表示,其中每個元素是一個不同的字符串,它是在輸入文件中製表符分隔的。我需要能夠快速訪問位於每行中的第2,3和4個字符串,並且該字符串現在是此數組的一個元素。

所以我想要的是能夠創建陣列的LL陣列...首先我會找到一個數組的第二個元素的ASCII值的總和。然後我會用Hash Table將這個值整個數組散列。然後,當我以後需要找到這個元素時,我將轉到數組的相應元素,其中我有一個數組列表。我將搜索列表中每個數組的第二個值。如果我找到了我想要的那個,那麼我返回該數組,然後使用此數組的第3個和第4個元素。

正如我所說,我對LL的一個數組工作正常,但添加陣列的額外維度已完全拋出我。我認爲它主要只是搞清楚語法,因爲我已經成功地初始化了一個LL數組的數組(公共靜態LinkedList [] RdHashLL),所以看起來Java本身就可以。但是,我不知道如何將元素放入哈希表中,以及如何將它們讀出。

下面是我的代碼爲一連串的列表,作品精細。我只需要幫助讓它工作的陣列陣列!

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; 
} 

}

我已經做了一些嘗試來改變這一點,但對於像如果(HashLL [charSum(S)]。包含(S)),其搜索在所述元件中的LL通過charsum返回(s)...我不知道如何在它是一個LL數組而不是字符串的時候讓它工作。我厭倦了HashLL [charSum(s)] [1] .contains(s))和HashLL [charSum(s)] [1] .contains(s))以及其他各種各樣的東西。

谷歌搜索「陣列鏈接列表」(帶引號)變爲空的事實並沒有幫助。

最後一位。我意識到可能會有另一種數據結構可以做我想做的事情,但是除非你相信一組LL陣列是完全沒有希望的,否則我想讓它按原樣工作。

+0

你在找'LinkedList [] hashLL;'? – jlordo

+0

你可以使用谷歌番石榴庫這種數據結構 –

+0

我可以初始化它作爲公共靜態LinkedList [] RdHashLL,但它得到它在功能上工作與添加值和搜索值我無法去工作。 –

回答

1

,如果你有

LinkedList<String[]>[] hashLL; 

你可以閱讀這樣一個特定的字符串(的途徑之一)

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

寫入到田間地頭,這是可能的(假設一切正確初始化)。

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

謝謝!這工作(對我需要做的一些小的改變)。非常感謝! –