
本文介绍在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());
}
}
}</character></character></character></character>
✅ 关键要点说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用
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… 的降序结果,满足高频字符优先展示的需求。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










