gpt4 book ai didi

java - TreeSet 中缺少键

转载 作者:行者123 更新时间:2023-11-30 06:41:01 27 4
gpt4 key购买 nike

我将 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

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]

最佳答案

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());

关于java - TreeSet 中缺少键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56412433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com