Hashtables的Java数组

时间:2011-03-27 14:21:11

标签: java hashtable

我需要一个程序中的Hashtables数组,该程序存储来自给定文档集的所有单词。

数组的索引1包含String的哈希表 - >存储单词的Double,以及文档1的计数(数组索引100 =文档编号100的哈希表)。

我在创建它时不需要使用此数据结构的帮助。 我声明Hashtable数组如下:

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

...但这不会编译。

(注意:Double是必要的,而不是上述声明中的Integer以供以后使用。)

问题: 如何创建一个存储String-&gt; Double ???

的哈希表数组

任何建议都赞赏了......

8 个答案:

答案 0 :(得分:5)

  

...但这不会编译。

那是因为数组没有名称,new需要许多元素,你不能只分配一个generics数组。请改为List

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

答案 1 :(得分:4)

只需使用

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

答案 2 :(得分:3)

为什么不使用Map<Integer, Map<String, Double> >? 这样就不会为不存在的文档浪费空间,仍然可以进行O(1)检索。

答案 3 :(得分:2)

你可以像这样创作。

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

答案 4 :(得分:1)

两件事:你不能用这样的参数化类型声明一个数组;你必须暗示它是new Hashtable[]。你需要给数组一个长度。

混合数组和集合虽然可能,但往往令人困惑并导致我的体验出现问题; HashMap通常比Hashtable更受欢迎。所以我倾向于选择List<Map<String, Double>>这个应用程序。

答案 5 :(得分:0)

Angelika Langer的泛型常见问题解答中涵盖了这是一个错误的原因:Can I create an array whose component type is a concrete parameterized type?

  

我可以创建一个组件类型为具体参数化类型的数组吗?

     

不,因为它不是类型安全的。

     

数组是协变的,这意味着   一个超类型引用数组是一个   子类型数组的超类型   引用。也就是说,Object[]是一个   超级类型String[]和字符串   数组可以通过a访问   Object[]类型的引用变量。

阵列和泛型可能有奇怪的交互(主要是由于实现妥协以支持兼容性)。您最好(larsmans suggested)查看合适的集合类型,例如ListMap

答案 6 :(得分:0)

阵列似乎是这里不寻常的结构选择。也许您应该考虑将哈希表存储在List中。如果您不知道提前有多少文档,它会动态调整大小。如果你使用ArrayList,你仍然可以随机读取随机值(如数组)。我认为它比使用数组简单得多,你仍然可以得到泛型类型检查。如果选择List,则语法将变为:

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

或者根据您想要的读/写模式选择LinkedList

答案 7 :(得分:0)

对于固定大小的数组:

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