2013-04-14 131 views
-2

我有一個家庭作業分配,我必須爲字典創建一個散列表,用戶可以在其中輸入單詞作爲鍵,它將搜索並顯示含義。Java哈希表密鑰。將字符串鍵轉換爲int鍵

但是我不確定從String鍵到int鍵的轉換是如何工作的。這是我從我的教科書中取得的代碼:

public int hashVal(String key, int tableSize) 
{ 
    int hashKey= 0; 
    int temp = 0; 
    for(int i=0;i<key.length();i++) 
    { 
     temp = 37*temp+(int)key.charAt(i); 
    } 
    temp%=tableSize; 
    if (temp<0) 
    { 
     temp+=tableSize; 
    } 
    hashKey=temp; 
    return hashKey; 
} 

解釋或更簡單的代碼將非常感激。

+1

這計算哈希值的字符串。 'temp'計算是不必要的,因爲'string.hashCode()'會做(除非你也需要實現)。一個mod操作將hashCode減少爲一個散列索引。整數可以溢出到負數,這樣也可以處理。 –

回答

0

字符串(或任何一般對象)散列的基本思想是使用輸入的所有部分,以便我們獲得相當隨機化和分佈式的值。

因此,對於字符串,我們使用字符串中的所有字符來計算散列值。 類似地,對於一個對象,建議在計算散列值時使用對象中的所有重要字段。

Java,類似地使用您的教科書代碼的變體。

問題:爲什麼你的教科書使用37? [Java類似地使用您的教科書代碼的變體,以31爲常數值]

答案:使用素數顯然會導致散列值在整個表格上更好的分佈。

0

你的代碼有幾個冗餘。你的散列計算 - 雖然不一定是錯誤的 - 也是非標準的。我不確定它是否會產生良好的分配,我認爲答案是否定的。

我建議兩個修改:使用37 * (int)key.charAt(i) + hash,並擺脫臨時變量。

因此,這變成:

public static int hashVal(String s, int max) { 
    int hash = 0; 
    for(Char c : s.toCharArray()) 
     hash = Math.abs((hash + 37*(int)c) % max); 
    return hash; 
} 
+0

更改方法的返回類型。您如何計劃使用負散列來表示0 - > N之間的數組索引? –

+0

是的,負散列索引如何有用?並感謝您的答覆btw。 – Seeker

+0

@ShuibParker對,我的壞。編輯。如果你只是把它保持在絕對值,那就不應該有問題。 – Zyerah