我有一个接收单词列表的方法。这些单词将根据字符串的hASHmap进行检查,该字符串具有String作为键,而Integer作为值。 String是一个单词,Integer表示文本文件中的单词频率。
目前,单词列表根据频率排列,将它们放入树形图中,频率成为关键。
但是,由于不存在重复键,因此Hashmap中具有相同频率值的任何单词都不会输入到Treemap中。
我可以做些什么才能拥有一个日期结构,其中包含按频率排列的单词,包括重复项?
//given a list of words return a TreeMap of those words ranked by most frequent occurence
private TreeMap rankWords(LinkedList unrankedWords) {
//treemap to automatically sort words by there frequency, making the frequency count the key.
TreeMap<Integer, String> rankedWordsMap = new TreeMap<Integer, String>();
//for each of the words unranked, find that word in the freqMap and add to rankedWords
for (int i = 0; i < unrankedWords.size(); i++) {
if (freqMap.containsKey((String) unrankedWords.get(i))) {
rankedWordsMap.put(freqMap.get((String) unrankedWords.get(i)),
(String) unrankedWords.get(i));
}
}
return rankedWordsMap;
}
答案 0 :(得分:4)
您应该重新考虑您的数据结构,以便拥有唯一的密钥。听起来你的结构是倒置的:它应该是Map
个字来计数,而不是相反,因为单词是唯一键,而计数是与键相关的值数据。
答案 1 :(得分:3)
我会从字符串到整数频率开始。
将entrySet()复制到List并按频率对其进行排序。
答案 2 :(得分:1)
你的过程有点破碎。 TreeMap的契约要求compareTo(...)
调用的行为永远不会在TreeMap的生命周期中发生变化。换句话说,您无法更新更改排序顺序的因素(例如更改频率)。
我的建议是做两件事之一:
如果表现不是很关键,我可能会选择第一个。否则,第二个选项看起来是一个很好的挑战
答案 3 :(得分:1)
列出条目并按条目值对它们进行排序。
List<Map.Entry<String, Integer>> results = new ArrayList<>();
results.addAll(freqMap.entrySet());
Collections.sort(new Comparator<Map.Entry<String, Integer>() {
@Override
public int compare(Map.Entry<String, Integer> lhs,
Map.Entry<String, Integer> rhs) {
int cmp = lhs.getValue() - rhs.getValue();
if (cmp == 0) {
cmp = lhs.getKey().compareTo(rhs.getKey());
}
return cmp;
}
});
答案 4 :(得分:0)
不确定这是否是最优雅的解决方案,但是一旦您的频率图完成,您可以将每个地图条目转换为表示每个地图条目的对象:
class Entry {
String word;
int frequency;
}
然后你只需为该对象的频率/值编写一个比较器进行排序。
答案 5 :(得分:0)
您可以使用a Set作为TreeMap的值,这样您就可以执行以下操作,按频率将字词添加到地图
TreeMap<Integer, Set<String>> rankedWordsMap = new TreeMap<>();
// inside loop
String word = (String) unrankedWords.get(i);
int frequency = freqMap.get(word);
// get the set of words with the same frequency
Set<String> wordSet = rankedWordsMap.get(frequency);
// if not yet existen, create and put it into the map
if(wordSet == null) {
wordSet = new HashSet<>();
rankedWordsMap.put(frequency, wordSet);
}
// add the word to set of words
wordSet.add(word);
这样你就可以保留所有频率相同的单词。