0

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

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

而且我还想得到一个排序列表,从而可以在短时间内对结构进行排序。

忘了说,我是用Java写的。

多谢你们!:)

4

5 回答 5

2

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

例如:

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

"TreeMap提供有保证的 O(log n) 查找时间(和插入等),而HashMap如果哈希码适当地分散键,则提供 O(1) 查找时间。除非您需要对条目进行排序,否则我会坚持使用HashMap." - Jon Skeet 在TreeMap 或 HashMap中回答的一部分。

于 2013-07-16T06:58:54.040 回答
1

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

于 2013-07-16T06:59:59.510 回答
1

定义一个以word为键,计数器为值的Hashmap

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

然后添加如下逻辑:

于 2013-07-16T07:00:07.450 回答
0

任何地图实现都可以。如果 Localized Changes 更喜欢 HashMap otherWise ConcurrentHashMap 用于多线程。

请记住使用任何词干库。 java中的词干库, 例如工作和逻辑工作是同一个词。

请记住 Integer 是不可变的,请参见下面的 示例 Example :

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**

}
于 2013-07-16T07:23:27.730 回答
0

因此,您可以使用 HashMap,但不要忘记多线程。这个数据结构可以通过几个线程访问吗?此外,您可以在数据有一些层次结构的情况下使用三个地图(例如,在 rakning 的情况下并按时间排序)。此外,您可以查看谷歌番石榴系列,它们可能更适合您。

于 2013-07-16T07:04:31.613 回答