Ключ отсутствует в TreeSet - PullRequest
2 голосов
/ 02 июня 2019

Я добавляю ключ hashMap один за другим в treeSet и пытаюсь отсортировать их по компаратору, переданному в lambda в treeSet.

Без компаратора, он работает нормально на основе TreeSet по умолчанию.

String s = "tree";
        Map<Character, Integer> freqMap = new HashMap<Character,Integer>();
        for(char ch:s.toCharArray()){
            freqMap.put(ch,freqMap.getOrDefault(ch,0)+1);
        }
        // need to sort TreeSet key with frequency wise
        TreeSet<Character> sortByFreq = new TreeSet<Character>((a,b)->freqMap.get(b).intValue() - freqMap.get(a).intValue());
        for(char ch :freqMap.keySet()){
            System.out.println("from HashMap "+ch);
            sortByFreq.add(ch);
            System.out.println("after adding "+ch+" Treeset like "+sortByFreq);

        }
        System.out.println(freqMap.keySet());
        System.out.println(sortByFreq);

Отсутствует ключ в TreeSet. Что я делаю не так в treeSet?

O / P

from HashMap r
after adding r Treeset like [r]
from HashMap t
after adding t Treeset like [r]
from HashMap e
after adding e Treeset like [e, r]
[r, t, e]
[e, r]

1 Ответ

3 голосов
/ 02 июня 2019

Ваш критерий сортировки для TreeSet также определяет, какие элементы считаются равными друг другу. Это означает, что два ключа с одинаковой частотой в freqMap будут считаться равными, поэтому только один из них будет добавлен в Set.

Если вы хотите, чтобы все ключи в TreeSet были добавлены к вашей Comparator логике прерывателя связей, чтобы определить порядок двух символов с одинаковой частотой.

TreeSet<Character> sortByFreq = new TreeSet<Character>((a,b)->{
                                                          int diff = Integer.compare(freqMap.get(b),freqMap.get(a)); 
                                                           return diff == 0 ? Character.compare(b,a) : diff;
                                                      });

Теперь вывод будет:

[e, t, r]

EDIT:

Или, как предложил Андреас:

TreeSet<Character> sortByFreq = new TreeSet<Character>(Comparator.comparing((Character c) -> freqMap.get(c))
                                                                 .thenComparing(Comparator.naturalOrder())
                                                                 .reversed());
...