Вот мое мнение: он отслеживает только первые n элементов в TreeSet.
import java.util.*;
import java.util.stream.Collectors;
public class TopN {
public static <E> Collection<E> topN(Iterable<E> values, Comparator<? super E> comparator, int n) {
NavigableSet<E> result = new TreeSet<>(comparator.reversed());
for (E value : values) {
result.add(value);
if (result.size() > n) {
result.remove(result.last());
}
}
return result;
}
public static void main(String[] args) {
Map<String, Integer> hm = Map.of(
"a", 1,
"b", 12,
"c", 53,
"d", 2,
"e", 17,
"f", 8,
"g", 8);
List<String> result = topN(hm.entrySet(), Map.Entry.comparingByValue(), 3)
.stream()
.map(Map.Entry::getKey)
.collect(Collectors.toList());
System.out.println(result);
}
}
Окончательный результат: [c, e, b]