我要在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]
答案 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());