You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用java.util.Collections.sort()对ConcurrentHashMap按值排序

按词频排序ConcurrentHashMap中的单词列表

要实现按词频排序输出单词列表,核心是对单词(键)进行排序,排序依据是其对应的词频(值),你之前的问题出在操作对象和Comparator类型匹配上,以下是具体实现方案:

方案1:使用Collections.sort+自定义Comparator

先把ConcurrentHashMap的键(单词)转成ArrayList,再通过自定义Comparator指定排序规则:

// 1. 将所有单词(键)提取到List中
List<String> wordList = new ArrayList<>(counts.keySet());

// 2. 自定义排序规则:先按词频降序,词频相同则按字母升序
Collections.sort(wordList, new Comparator<String>() {
    @Override
    public int compare(String word1, String word2) {
        Integer freq1 = counts.get(word1);
        Integer freq2 = counts.get(word2);
        // 降序排序词频,若词频一致则按字母顺序升序
        int freqCompare = freq2.compareTo(freq1);
        return freqCompare != 0 ? freqCompare : word1.compareTo(word2);
    }
});

// 输出结果
System.out.println(wordList);

方案2:Java 8+ Stream API(更简洁)

利用Stream对EntrySet排序,直接提取排序后的单词:

List<String> sortedWordList = counts.entrySet()
    .stream()
    // 排序规则:先按词频降序,再按单词字母升序
    .sorted(Map.Entry.<String, Integer>comparingByValue(Comparator.reverseOrder())
            .thenComparing(Map.Entry.comparingByKey()))
    // 提取单词(键)
    .map(Map.Entry::getKey)
    // 收集为List
    .collect(Collectors.toList());

// 输出结果
System.out.println(sortedWordList);

错误原因说明

  • 直接取counts.values()创建ArrayList得到的是词频的列表,不是单词列表,自然无法得到期望的[the, of, ...]格式;
  • 自定义Comparator时如果参数类型不是String(单词类型),而是Integer(词频类型),就会和要排序的单词列表类型不匹配,导致报错。

内容的提问来源于stack exchange,提问作者Bluetail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:36:38