Java TreeSet中缺少密钥

Java TreeSet中缺少密钥,java,treeset,Java,Treeset,我将hashMap键逐个添加到treeSet中,并尝试根据treeSet中lambda中传递的比较器对它们进行排序 在没有比较器的情况下,它可以基于默认树集正常工作 字符串s=树; Map freqMap=新的HashMap; 福查:托查雷{ freqMap.putch,freqMap.getOrDefaultch,0+1; } //需要按频率对TreeSet键进行排序 TreeSet sortByFreq=新的TreeSeta,b->freqMap.getb.intValue-freqMap.

我将hashMap键逐个添加到treeSet中,并尝试根据treeSet中lambda中传递的比较器对它们进行排序

在没有比较器的情况下,它可以基于默认树集正常工作

字符串s=树; Map freqMap=新的HashMap; 福查:托查雷{ freqMap.putch,freqMap.getOrDefaultch,0+1; } //需要按频率对TreeSet键进行排序 TreeSet sortByFreq=新的TreeSeta,b->freqMap.getb.intValue-freqMap.geta.intValue; forchar ch:freqMap.keySet{ System.out.printlnfrom HashMap+ch; sortByFreq.addch; System.out.println添加+ch+Treeset like+sortByFreq后; } System.out.printlnfreqMap.keySet; System.out.printlnsortByFreq; 树上少了一些钥匙。我在treeSet做错了什么

O/p


树集的排序标准还定义了哪些元素被视为彼此相等。这意味着freqMap中具有相同频率的两个键将被视为相等,因此只有一个键将添加到集合中

如果你想把所有的键都放在树集合中,你应该给比较器添加一个断开连接的逻辑,来定义两个具有相同频率的字符的顺序

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;
                                                      });
编辑:

或者,正如安德烈亚斯所建议的:

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

您还可以将其编写为new TreeSetComparator.comparingCharacter c->freqMap.getc.Then ComparingComparator.naturalOrder。reversed@Andreas谢谢,我正试图找到一个通过编译的版本。你的版本有效。
[e, t, r]
TreeSet<Character> sortByFreq = new TreeSet<Character>(Comparator.comparing((Character c) -> freqMap.get(c))
                                                                 .thenComparing(Comparator.naturalOrder())
                                                                 .reversed());