TreeMap отсортировано по значению ошибки - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу отсортировать древовидную карту по значению, для этого я использую набор>, вот мой код:

StringBuilder sb = new StringBuilder();
        Map<Character, Integer> map = new TreeMap<>();
        for (char c : s.toCharArray()){
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        TreeSet<Map.Entry<Character, Integer>> set = new TreeSet<Map.Entry<Character, Integer>>(){
            public int compare(Map.Entry<Character, Integer> e1, Map.Entry<Character, Integer> e2){
                return e2.getValue() - e1.getValue();
            }
        };
        for (Map.Entry<Character, Integer> e : map.entrySet()){
            set.add(e);
        }
        // set.addAll(map.entrySet());
        for (Map.Entry<Character, Integer> e : set){
            for (int i = 0; i < e.getValue(); i++){
                sb.append(e.getKey());
            }
        }
        return sb.toString();

Но я получаю следующую ошибку:

Exception in thread "main" java.lang.ClassCastException: java.util.TreeMap$Entry cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1251)
    at java.util.TreeMap.put(TreeMap.java:495)
    at java.util.TreeSet.add(TreeSet.java:212)
    at Solution.frequencySort(Solution.java:14)
    at __DriverSolution__.__helper__(__Driver__.java:4)
    at __Driver__.main(__Driver__.java:48)

Так почему я не могу добавить набор записей в набор деревьев?

Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Поскольку Map.Entry не реализует Comparable. Вы также не предоставляете Comparator для TreeSet, даже если вы думаете, что это уже так.

С Java 10 вы можете использовать следующее:

var set = new TreeSet<>(Comparator.<Map.Entry<Character, Integer>, Integer>comparing(Map.Entry::getValue).reversed());
...