我想在网站上存储一些单词及其出现次数,我不知道应该使用哪种结构。
每次我在结构中添加一个单词时,它首先检查单词是否已经存在,如果是,则发生时间加一,如果不存在,则将单词添加到结构中。因此,通过使用此结构,我可以非常快速地找到元素。我想我应该使用散列表或散列图,对吗?
我还希望获得一个排序列表,因此可以在短时间内对结构进行排名。
忘记提及,我正在使用Java来编写它。
谢谢你们! :)
答案 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>();
然后添加如下逻辑:
答案 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**
}