TreeSet中缺少键

时间:2019-06-02 05:30:00

标签: java treeset

我要在treeSet中将hashMap关键字一一添加,并尝试根据在treeSet中的lambda中传递的比较器对它们进行排序。

没有比较器,根据默认的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 个答案:

答案 0 :(得分:0)

您对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]

编辑:

或者,正如安德里亚斯(Andreas)建议的那样:

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