Вы используете TreeMap
для сортировки записей. TreeMap
сортирует записи по ключу, а не по значению.
Вы можете использовать streams
и LinkedHashMap
для этого задания:
public static void wordOccurrence(String text) {
String[] wordSplit = text.split(" ");
Map<String, Long> map = Arrays.stream(wordSplit)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
List<Entry<String, Long>> list = new ArrayList<>(map.entrySet());
list.sort(Entry.comparingByValue(Comparator.reverseOrder()));
Map<String, Long> occurrence = list.stream()
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (s1, s2) -> s1, LinkedHashMap::new));
occurrence.entrySet().forEach(entry -> System.out.println(entry.getKey()+";"+entry.getValue()));
}
Или без использования List
:
public static void wordOccurrence(String text) {
String[] wordSplit = text.split(" ");
Map<String, Long> map = Arrays.stream(wordSplit)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Map<String, Long> occurrence = map.entrySet().stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (s1, s2) -> s1, LinkedHashMap::new));
occurrence.entrySet().forEach(entry -> System.out.println(entry.getKey()+";"+entry.getValue()));
}
Если вам просто нужно верхнее «n», вы можете добавить строку с .limit(n)
:
Map<String, Long> occurrence = map.entrySet().stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.limit(5)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (s1, s2) -> s1, LinkedHashMap::new));