2011-03-27 101 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>()};