【问题标题】:Java array of HashtablesJava 哈希表数组
【发布时间】:2011-07-23 22:00:08
【问题描述】:

我需要一个程序中的哈希表数组来存储给定文档集中的所有单词。

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

我不需要帮助使用这个数据结构,只是在创建它。 我声明哈希表数组如下:

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

...但这不会编译。

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

问题: 你如何创建一个存储 String->Double 的哈希表数组???

任何建议都非常感谢伙计们......

【问题讨论】:

标签: java hashtable


【解决方案1】:

...但这不会编译。

那是因为数组没有名称,new 需要许多元素,而您不能只分配 generics 的数组。更喜欢List

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

【讨论】:

  • 对不起,你不能那样做 :) 如果你不相信我,试着编译一下
【解决方案2】:

随便用

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

【讨论】:

    【解决方案3】:

    你可以这样创作。

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

    【讨论】:

      【解决方案4】:

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

      虽然可以混合使用数组和集合,但在我的经验中往往会造成混淆并导致问题; HashMap 通常也比 Hashtable 更受欢迎。因此,对于此应用程序,我倾向于使用 List&lt;Map&lt;String, Double&gt;&gt;

      【讨论】:

        【解决方案5】:

        你为什么不使用 Map&lt;Integer, Map&lt;String, Double&gt; &gt; ? 这样您就不会为不存在的文档浪费空间,并且仍然可以获得 O(1) 检索。

        【讨论】:

          【解决方案6】:

          Angelika Langer 的泛型常见问题解答中介绍了此错误的原因:Can I create an array whose component type is a concrete parameterized type?

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

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

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

          数组和泛型可以有奇怪的交互(主要是由于实现妥协以支持兼容性)。你可能会更好(如larsmans suggested)查看合适的集合类型,例如Maps 的List

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              【解决方案8】:

              对于固定大小的数组:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-10-13
                • 2010-10-29
                • 2011-08-22
                • 2017-03-14
                • 1970-01-01
                • 1970-01-01
                • 2014-02-01
                • 2017-04-13
                相关资源
                最近更新 更多