我需要一个程序中的Hashtables数组,该程序存储来自给定文档集的所有单词。
数组的索引1包含String的哈希表 - >存储单词的Double,以及文档1的计数(数组索引100 =文档编号100的哈希表)。
我在创建它时不需要使用此数据结构的帮助。 我声明Hashtable数组如下:
Hashtable<String,Double>[] h1 = new Hashtable<String,Double>[];
...但这不会编译。
(注意:Double是必要的,而不是上述声明中的Integer以供以后使用。)
问题: 如何创建一个存储String-&gt; Double ???
的哈希表数组任何建议都赞赏了......
答案 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)查看合适的集合类型,例如List的Map。
答案 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>()};