Java的Hashtable数组

5

我需要在一个程序中创建一个哈希表数组,用于存储给定文档集中的所有单词。

数组的索引1包含一个哈希表,其中键为String类型,值为Double类型,用于存储文档1中的单词及其计数(数组索引100 = 文档编号100的哈希表)。

我不需要使用这个数据结构的帮助,只需要创建它。我按以下方式声明哈希表数组:

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

......但是这样写无法编译。

(注意:在上面的声明中,双精度 Double 是必需的,而不是整型 Integer,以供以后使用。)

问题: 如何创建一个哈希表数组,用于存储字符串 -> 双精度 Double ?

大家有什么建议,请提出来......


4
https://dev59.com/3XE85IYBdhLWcg3wZyqt - Mitch Wheat
8个回答

5

...但是这段代码无法编译。

这是因为数组没有名称,new需要指定元素的数量,而你不能仅仅分配一个泛型数组。建议使用List代替:

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

抱歉,你不能以那种方式做这件事 :) 如果你不相信我,请尝试编译它。 - lukastymo

4

只需使用

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

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

2
你可以像这样创建。
Hashtable<String,Double>[] arr = new Hashtable[10];

1
两件事情:你不能像那样使用参数化类型声明数组;你必须隐式地声明一个new Hashtable[]。并且你需要给数组一个长度。
混合使用数组和集合虽然可能,但在我的经验中往往会导致混淆和问题;此外,HashMap通常比Hashtable更受欢迎。因此,我倾向于为这个应用程序选择一个List<Map<String, Double>>

0

对于固定大小的数组:

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

0

在这里,数组似乎是一个不寻常的结构选择。也许您应该考虑将哈希表存储在列表中。如果您事先不知道将有多少文档,它将动态调整大小。如果您使用 ArrayList ,您仍将具有随机索引(如数组)的恒定读取时间。我认为与数组相比,这要简单得多,并且仍然可以获得通用类型检查。如果您选择列表,则语法变为:

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

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


0

这是一个错误的原因在于Angelika Langer的泛型FAQ中有所涉及:我能创建一个组件类型为具体参数化类型的数组吗?

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

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

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

数组和泛型可能会有奇怪的交互作用(这主要是由于实现妥协以支持兼容性所致)。你最好(正如larsmans建议的那样)查看适当的集合类型,例如MapList


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接