基于值降序排序Map:统计字符串字符频次并优先输出高频字符
字符频次统计并按频次降序排序实现方案
需求说明
- 目标字符串:
str = "PriyankaTaneja" - 核心需求:使用Map统计字符串中每个字符的出现频次,再将Map按频次降序排序(出现次数多的字符优先输出)
现有代码分析
你已实现的字符频次统计代码可完成计数,但缺少按值排序的逻辑,原代码如下:
Map<Character, Integer> map = new HashMap(); for(char c : ch) { if(map.get(c) == null) { map.put(c, 1); } else { map.put(c, map.get(c)+1); } } for(Map.Entry entry : map.entrySet()) { System.out.println("Key is "+ entry.getKey() + " Value is " + entry.getValue()); }
优化实现方案
1. 简化频次统计逻辑
使用HashMap.merge()方法简化原计数逻辑,代码更简洁高效:
String str = "PriyankaTaneja"; char[] ch = str.toCharArray(); Map<Character, Integer> map = new HashMap<>(); // 统计每个字符的出现次数 for (char c : ch) { map.merge(c, 1, Integer::sum); }
2. 按频次降序排序输出
提供两种常用的排序实现方式:
方式一:基于List排序遍历
将Map的Entry集合转为List后,自定义比较器实现降序排序:
// 将Map条目转为List,用于排序 List<Map.Entry<Character, Integer>> entryList = new ArrayList<>(map.entrySet()); // 按频次降序排序,若频次相同可按字符升序(可选) entryList.sort((e1, e2) -> { int freqCompare = e2.getValue().compareTo(e1.getValue()); return freqCompare != 0 ? freqCompare : e1.getKey().compareTo(e2.getKey()); }); // 输出排序结果 for (Map.Entry<Character, Integer> entry : entryList) { System.out.println("字符: " + entry.getKey() + " 出现次数: " + entry.getValue()); }
方式二:使用Stream API实现
通过Stream的sorted()方法直接完成排序和输出,代码更简洁:
map.entrySet().stream() // 按频次降序排序 .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) // 输出结果 .forEach(entry -> System.out.println("字符: " + entry.getKey() + " 出现次数: " + entry.getValue()));
完整示例代码
import java.util.*; public class CharFrequencySort { public static void main(String[] args) { String str = "PriyankaTaneja"; char[] ch = str.toCharArray(); Map<Character, Integer> map = new HashMap<>(); // 统计字符频次 for (char c : ch) { map.merge(c, 1, Integer::sum); } // List排序输出 System.out.println("List排序输出结果:"); List<Map.Entry<Character, Integer>> entryList = new ArrayList<>(map.entrySet()); entryList.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue())); for (Map.Entry<Character, Integer> entry : entryList) { System.out.println("字符: " + entry.getKey() + " 出现次数: " + entry.getValue()); } // Stream API输出 System.out.println("\nStream API输出结果:"); map.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .forEach(entry -> System.out.println("字符: " + entry.getKey() + " 出现次数: " + entry.getValue())); } }
内容的提问来源于stack exchange,提问作者priyanka
相关产品推荐
相关产品推荐

