2011-03-27 97 views
5

我需要一個程序中的哈希表數組,它存儲了來自給定文檔集的所有單詞。Java數組哈希表

該數組的索引1包含一個String - > Double存儲一個單詞的哈希表,以及它對文檔1(數組索引100 =文檔編號100的哈希表)的計數。

我不需要使用這個數據結構的幫助,只是在創建它。 我宣佈Hashtable的數組如下:

Hashtable<String,Double>[] h1 = new Hashtable<String,Double>[]; 

...但是這不會編譯。

(注:雙是必要的,而不是在以後使用上述聲明的整數。)

問題: 如何創建存儲與字符串>雙哈希表的數組???

讚賞你們有什麼建議....

+4

http://stackoverflow.com/questions/2792731/how-to-do-an-array-of-hashmaps – 2011-03-27 14:23:58

回答

4

...但是這不會編譯。

這是因爲數組有沒有名字,new預計許多元素,你不能只分配的generics陣列。喜歡List代替:

List<Hashtable<String,Double>> wordCountPerDoc 
    = new ArrayList<Hashtable<String,Double>>(); 
+0

感謝錯字,請參閱編輯 – 2011-03-27 14:23:21

+0

抱歉,你不能這樣做:)如果你不相信我試試編譯它 – smas 2011-03-27 14:27:13

+0

@smas:你說得對,思考,修正。 – 2011-03-27 14:28:56

4

只使用

@SuppressWarnings("unchecked") 
    Hashtable<String,Double>[] h = (Hashtable<String,Double>[])new Hashtable<?,?>[10]; 
    h[0] = new Hashtable<String, Double>(); 
2

你可以創建這樣的。

Hashtable<String,Double>[] arr = new Hashtable[10]; 
1

有兩件事:你不能用這樣的參數化類型聲明一個數組;你必須暗示將其聲明爲new Hashtable[]。你需要給陣列一個長度。

混合數組和集合雖然可能,但往往會令人困惑並導致我的經驗出現問題; HashMap通常比Hashtable更受歡迎。所以我傾向於選擇List<Map<String, Double>>這個應用程序。

3

你爲什麼不使用Map<Integer, Map<String, Double> >? 這樣你就不會爲不存在的文件浪費空間,並且仍然可以獲得O(1)檢索。

0

爲什麼這是一個錯誤都屬於安格莉卡朗格的泛型常見問題的原因:Can I create an array whose component type is a concrete parameterized type?

我可以創建一個數組,其組件類型是一個具體的參數化類型?

不,因爲它不是類型安全的。

數組是協變,這意味着 超類型引用數組是亞型 引用數組的 超類型。即,Object[]是 超類型String[]和字符串 可以通過Object[]類型的 參考變量訪問數組。

數組和泛型可以有奇怪的相互作用(很大程度上是由於支持兼容性的實現妥協)。您可能會更好(如larsmans suggested),查看合適的收集類型,例如Map s的List

0

這裏的數組似乎是一個不尋常的結構選擇。也許你應該考慮將你的哈希表存儲在List中。如果您不知道您將提前獲得多少文檔,它將動態調整大小。如果你使用的是ArrayList,你仍然會有隨機數的常量讀取(就像數組一樣)。我認爲它比使用數組簡單得多,而且你仍然可以獲得泛型類型檢查。如果你選擇一個列表,你的語法變爲:

List<Map<String,Double>> documentWordCounts = new ArrayList<Map<String,Double>>(); 

或者選擇取決於你想要什麼樣的讀取/寫入模式的一個LinkedList

0

對於固定大小的數組:

Hashtable<String,Double>[] h1 = new Hashtable[]{new Hashtable< String,Double>(),new Hashtable< String,Double>(),new Hashtable< String,Double>()};