我将hashMap键一个一个地添加到treeSet中,并尝试根据在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
从HashMap r中添加r树集类似r,从HashMap t添加t树集,从HashMap e添加t树集,添加e,r,r。
发布于 2019-06-02 05:32:26
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]
编辑:
或者,正如安德烈亚斯所说:
TreeSet<Character> sortByFreq = new TreeSet<Character>(Comparator.comparing((Character c) -> freqMap.get(c))
.thenComparing(Comparator.naturalOrder())
.reversed());
https://stackoverflow.com/questions/56412433
复制相似问题