Я пытаюсь найти три самых высоких значения в TreeMap. Я написал код, который это делает, но я хотел бы спросить, можете ли вы предложить более эффективный способ. В основном я сохраняю каждое слово своего текста в TreeMap вместе с количеством раз, которое оно появляется в тексте. Затем я использую компаратор для сортировки значений. Затем я повторяю новую карту до тех пор, пока не получу последние три значения, которые являются самыми высокими значениями после сортировки и распечатывают их. Я собираюсь использовать большие тексты, так что это не очень хороший способ. Вот мой код:получить три самых высоких значения в TreeMap
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;
}
}
Избегайте имеет смысл, потому что вы «собираетесь использовать большие тексты» _. Поэтому, если вам не нужна сортировка для дальнейшей обработки, я бы выбрал это решение. – Kai
Благодарим вас за этот совет. Именно так я изменил свой код. – curious