使用HashMap通过迭代更新值来计算地图是一种好的做法吗?

时间:2014-07-16 20:52:46

标签: java hashmap collision

我经常使用散列图来计算值,例如:

  HashMap<String, Integer> map = new HashMap<String, Integer>();
  for(String word : wordList) {
       if(map.contains(word)) 
           map.put(word, map.get(word)+1)); 
       else 
           map.put(word, 1);
  }

这是可接受的做法吗?由于put / get操作通常需要O(1),除非发生碰撞,当发生碰撞时需要O(n)。

我能想到的另一种方法是使用包含单词索引的hashmap,并使用一个数组,这需要列表的一次迭代,但考虑到它可能会因为第一次碰撞而发生方式,也许它会更好。这样,您将占用更多内存来保存另一个索引hashmap。

当你不得不计算单词时,你们通常做什么/推荐什么?

2 个答案:

答案 0 :(得分:3)

使用番石榴Multiset。这正是它的设计目标。

答案 1 :(得分:3)

对于大多数情况HashMap就足够了。但是Guava的Multiset使用起来更加舒适,因为它可以处理样板代码。

对于非常大的单词集,尽管您可能希望使用优化的散列函数,因为the one built into String is known to produce quite a lot of collisions

如果您的字符串不是很长但是你的字符串很多,那么trie可能会有更好的最坏情况。