如何使用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
相关产品推荐
相关产品推荐

