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

基于值降序排序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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:25:14