首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TreeSet中缺少密钥

TreeSet中缺少密钥
EN

Stack Overflow用户
提问于 2019-06-02 05:30:00
回答 1查看 138关注 0票数 3

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

如果没有比较器,它将基于默认的TreeSet很好地工作。

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2019-06-02 05:32:26

TreeSet的排序条件还定义了哪些元素被认为是相等的。这意味着在freqMap中具有相同频率的两个键将被视为相等,因此只有一个键将被添加到Set中。

如果您想拥有TreeSet中的所有键,您应该在您的Comparator中添加一个平手逻辑,以定义频率相同的两个字符的顺序。

代码语言:javascript
运行
复制
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;
                                                      });

现在的输出将是:

代码语言:javascript
运行
复制
[e, t, r]

编辑:

或者,正如安德烈亚斯所说:

代码语言:javascript
运行
复制
TreeSet<Character> sortByFreq = new TreeSet<Character>(Comparator.comparing((Character c) -> freqMap.get(c))
                                                                 .thenComparing(Comparator.naturalOrder())
                                                                 .reversed());
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56412433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档