我应该使用哪种数据结构?

时间:2013-07-16 06:58:05

标签: java data-structures hash hashmap hashtable

我想在网站上存储一些单词及其出现次数,我不知道应该使用哪种结构。

每次我在结构中添加一个单词时,它首先检查单词是否已经存在,如果是,则发生时间加一,如果不存在,则将单词添加到结构中。因此,通过使用此结构,我可以非常快速地找到元素。我想我应该使用散列表或散列图,对吗?

我还希望获得一个排序列表,因此可以在短时间内对结构进行排名。

忘记提及,我正在使用Java来编写它。

谢谢你们! :)

5 个答案:

答案 0 :(得分:2)

HashMap似乎很适合你。如果您需要线程安全选项,请使用ConcurrentHashMap

例如:

Map<String, Integer> wordOccurenceMap = new HashMap<>();

TreeMap提供保证的O(log n)查找时间(和插入等),而HashMap提供O(1)查找时间,如果哈希代码适当地分散键。除非您需要条目为了排序,我坚持HashMap。“ - Jon Skeet在TreeMap or HashMap中的回答。

答案 1 :(得分:1)

如果您想要排序功能和计算单词,TreeMap是更好的解决方案。 自定义Trie可以提高效率,但除非您修改单词,否则不需要它。

答案 2 :(得分:1)

定义Hashmap,其中word为键,counter为值

Map<String,Integer> wordsCountMap = new HashMap<String,Integer>();

然后添加如下逻辑:

  • 获得一个字后,使用containsKey方法
  • 在地图中查看
  • 如果找到key(word),则使用get获取值并增加值
  • 如果找不到密钥(word),请使用thw word作为密钥添加值,将put添加为count 1作为值

答案 3 :(得分:0)

所以,你可以使用HashMap,但不要忘记多线程。这个数据结构是否可以通过几个线程访问?此外,在数据具有一些层次结构的情况下,您可以使用三个映射(例如,在rankning的情况下并按时间对其进行排序)。此外,你可以浏览谷歌番石榴收藏品,可能,它们会更加适合你。

答案 4 :(得分:0)

任何地图实施都会。如果Localized Changes更喜欢HashMap otherWise 用于多线程的ConcurrentHashMap。

请记住使用任何词干库。 stemming library in java 例如工作和工作在逻辑上是同一个词。

记住整数是不可变的,请参阅下面的示例 示例:

Map<String, Integer> occurrence = new ConcurrentHashMap<String, Integer>();

synchronized void addWord(String word) { // may need to synchronize this method
    String stemmedWord = stem(word);
    Integer count = occurrence.get(stemmedWord)
    if(count == null) {
      count = new Integer(0);
    }
    count ++; 
    occurrence.put(stemmedWord, count); 
   **// the above is necessary as Integer is immutable**

}