gpt4 book ai didi

java - 获取 TreeMap 中的三个最高值

转载 作者:搜寻专家 更新时间:2023-11-01 02:51:17 25 4
gpt4 key购买 nike

我试图在 TreeMap 中找到三个最高值。我写了一段代码,有点像这样做,但我想问问你是否可以建议一种更有效的方法。基本上,我将文本中的每个单词连同它在文本中出现的次数一起保存在 TreeMap 中。然后我使用比较器对值进行排序。然后我遍历新创建的 Map 直到我到达最后三个值,这是排序后的最高值并将它们打印出来。我打算使用大文本,所以这不是一个很好的方法。这是我的代码:

class Text{
public static void main(String args[]) throws FileNotFoundException, IOException{
final File textFile = new File("C://FileIO//cinderella.txt");
final BufferedReader in = new BufferedReader(new FileReader(textFile));
final TreeMap<String, Integer> frequencyMap = new TreeMap<String, Integer>();

String currentLine;
while ((currentLine = in.readLine()) != null) {
currentLine = currentLine.toLowerCase();
final StringTokenizer parser = new StringTokenizer(currentLine, " \t\n\r\f.,;:!?'");
while (parser.hasMoreTokens()) {
final String currentWord = parser.nextToken();
Integer frequency = frequencyMap.get(currentWord);
if (frequency == null) {
frequency = 0;
}
frequencyMap.put(currentWord, frequency + 1);
}
}

System.out.println("This the unsorted Map: "+frequencyMap);

Map sortedMap = sortByComparator(frequencyMap);
int i = 0;
int max=sortedMap.size();
StringBuilder query= new StringBuilder();

for (Iterator it = sortedMap.entrySet().iterator(); it.hasNext();) {
Map.Entry<String,Integer> entry = (Map.Entry<String,Integer>) it.next();
i++;
if(i<=max && i>=(max-2)){
String key = entry.getKey();
//System.out.println(key);
query.append(key);
query.append("+");
}
}
System.out.println(query);
}

private static Map sortByComparator(TreeMap unsortMap) {
List list = new LinkedList(unsortMap.entrySet());

//sort list based on comparator
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) (o1)).getValue())
.compareTo(((Map.Entry) (o2)).getValue());
}
});

//put sorted list into map again
Map sortedMap = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry)it.next();
sortedMap.put(entry.getKey(), entry.getValue());

}
return sortedMap;
}
}

最佳答案

我会用 HashMap 计算频率,然后遍历所有频率,选择前 3 个。这样可以最大限度地减少比较,而且永远不必排序。使用 Selection Algorithm

-edit,维基百科页面详细介绍了选择算法的许多不同实现。具体来说,只需使用有界优先级队列,并将大小设置为 3。不要幻想将队列实现为堆或任何东西。只需使用一个数组。

关于java - 获取 TreeMap 中的三个最高值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10676281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com