2014-03-06 75 views
0

我想創建一個基本的文件系統。我不允許使用Collections庫。該文件系統存儲兩種類型的數據FilesDirectories。類型FileDirectory都是抽象類型Entry的子類。HashTable沒有集合庫

我的設計到目前爲止

我的哈希函數是採取Entry的名字,將每個字符的名稱爲整數,總結起來到一個值。接下來MOD與數組的大小值,以確定它被放置

protected static int hashFunction(String entryName) { 
     char[] a = entryName.toCharArray(); 
     int sum = 0; 
     // convert String to integer Value 
     for (char b : a) { 
      sum += (int) b; 
     } 
     int hashValue = sum % hashTableKey; 
     return hashValue; 
    } 

什麼我有麻煩正在設計的哈希表。目前,一旦散列函數計算值,我將EntryentryName)的名稱存儲在相對於hashVaue的數組中。我將實際對象存儲在另一個相同大小的數組中以容納這些對象。這些對象的存儲與它們在數組中的名稱具有相同的索引,並保存對象的名稱。

*的對象可以是文件或目錄

| "obj1" | None | "obj3" | None | None | None | "obj2" | None | 

| obj1 | None | obj3 | None | None | None | obj2 | None | 

不知道這是落實使用哈希表中的文件系統的好方法。我選擇哈希表的原因是由於O(1)查找。但是它有很大的空間需求。特別是我實施它的方式。如果有更好的方法來實現文件系統,請讓我知道!我對創意很開放!

+1

爲什麼不直接調用'entryName.hashCode()'得到一個哈希碼,不感興趣?如果這只是一個學術練習(我認爲它是,如果你不能使用標準集合)是O(1)查找真的需要嗎? –

+0

@JonSkeet這看起來像是功課,但我實際上是通過學習和練習面試問題來學習Java。我忘了'hashCode()'。不知道它是如何工作的,但我可以查看它。我的猜測是修改使用hashCode()大小的結果放置在正確的位置?我想做O(1),因爲它在訪談中看起來不錯haha – Liondancer

回答

1

我不認爲你應該有另一個數組,你可以將實際的對象存儲在第一個數組中,因爲實體會知道它的名字,所以選擇元素時的理智檢查很容易。

雖然我認爲作爲設計缺陷,除非我誤解了某些東西,但是當兩個文件具有相同的哈希代碼時,實際上容易出錯,因爲您只能在該處存儲儘可能多的對象在你的散列表中。

它是如何解決的是,你應該有一個LinkedList數組(而不必使用Collections的鏈表),並將實體存儲在列表中,而不是使用字符串和實體數組。這會使你的性能依賴於你的散列函數的好壞,但這也會減少所需的空間,儘管不是很多。這就是實際上Java的哈希映射多少起作用的方式。

就個人而言,我真的不喜歡依賴兩個在同一個索引上具有相同對象的數組,它只是非常容易出錯。

+0

我還沒有創建處理碰撞的方法。我打算只增加1,並將對象和字符串放在下一個索引中,如果存儲entryNames的數組已經包含名稱 – Liondancer

+1

這是處理它的一種方法,但是您必須處理這樣的事實:如果你與我的元素'a'和'b'碰撞,那麼你將項目'b'添加到i + 1,但是在將會有一個項目'b'和哈希碼i + 1,所以你把它放到i + 1上,那麼你將不得不查看'c'項目,你會看到i + 1,在這種情況下你不會找到它,好吧看看i + 2。這可能會升級和混亂你的表現,你的代碼會看起來很難看:) – maczikasz