
本文介绍在java中对字符频次统计map按值(value)降序排序的完整实现,使用stream api结合comparator.reverseorder(),并确保插入顺序通过linkedhashmap保留。
本文介绍在java中对字符频次统计map按值(value)降序排序的完整实现,使用stream api结合comparator.reverseorder(),并确保插入顺序通过linkedhashmap保留。
在处理字符串字符频次统计时,我们常使用 HashMap<character integer></character> 存储每个字符及其出现次数。但原生 HashMap 不保证任何顺序,若需按频次从高到低输出(例如分析“PriyankaTaneja”中哪个字符最频繁),就必须对映射进行显式排序。
核心思路是:不直接排序Map本身(因其无序),而是对其entrySet()流式处理,按value降序排列后,收集为保持插入顺序的LinkedHashMap。
以下是完整、可运行的示例代码:
import java.util.*;
import java.util.stream.Collectors;
public class SortMapByValueDesc {
public static void main(String[] args) {
String str = "PriyankaTaneja";
char[] ch = str.toCharArray();
// 步骤1:统计字符频次
Map<Character, Integer> map = new HashMap<>();
for (char c : ch) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
// 步骤2:按value降序排序,并重建为LinkedHashMap(维持排序后顺序)
Map<Character, Integer> sortedMap = map.entrySet()
.stream()
.sorted(Map.Entry.<Character, Integer>comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1, // 冲突时保留前者(实际不会发生,因key唯一)
LinkedHashMap::new
));
// 步骤3:遍历输出(顺序即为频次降序)
for (Map.Entry<Character, Integer> entry : sortedMap.entrySet()) {
System.out.println("Key is " + entry.getKey() + " Value is " + entry.getValue());
}
}
}✅ 关键要点说明:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 使用
map.getOrDefault(c, 0) + 1替代冗余的null判断,代码更简洁安全; -
Map.Entry.comparingByValue(Comparator.reverseOrder())明确指定按值降序比较; -
Collectors.toMap(..., LinkedHashMap::new)中的第四参数指定底层Map类型为LinkedHashMap,这是维持流排序结果顺序的必要条件(普通HashMap会丢失顺序); - 合并函数
(e1, e2) -> e1是必需形参(因键唯一,实际永不触发),不可省略。
⚠️ 注意事项:
- 若存在相同value(如多个字符均出现2次),其相对顺序取决于原始
entrySet()迭代顺序(未定义),如需进一步按字母升序稳定排序,可链式添加.thenComparing(Map.Entry::getKey); - Java 8+ 环境下推荐此Stream方案;若需兼容旧版本,可改用
List<map.entry></map.entry>+Collections.sort()手动实现。
通过该方法,输入 "PriyankaTaneja" 将正确输出类似 a=3, n=2, k=2, P=1, r=1… 的降序结果,满足高频字符优先展示的需求。

















