统计字符串中各字符出现的频率并按要求打印

给出一个字符串str,要求按照字符出现的频率,降序打印出来,比如如下结果:

输入:ahinfhhaaahgiajrbgjbsgbaa

输出:aaaaaaahhhhbbbgggiijjrsfn

 

======================================================

在统计字符串出现的频率时,我们很容易便想到利用Map:Map中的key可以用来存放出现的字符,value可以用来记录对应的key出现的次数。难点便是,如何去对Map中的value进行降序排序,并且打印key。

我个人的话是忘了Map中是否有方法可以直接对value进行排序的了,所以只能利用List来对Map的Entry进行排序。求得结果之后,才按照顺序把对应的key打印出来。其中我们在利用List进行排序时,需要实现Comparator接口,重写compare方法。

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = "";
        System.out.println("请输入字符串:");
        str = sc.nextLine();
        printString(str);
    }
    
    public static void printString(String str) {
        char[] ch = str.toCharArray();
        Map<Character, Integer> map = new HashMap<>();
        for(char c : ch) {
            if(map.containsKey(c)) {
                int k = map.get(c) + 1;
                map.put(c, k);
            }else {
                map.put(c, 1);
            }
        }
        List<Map.Entry<Character, Integer>> list = new ArrayList<>();
        for(Map.Entry<Character, Integer> entry : map.entrySet()) {
            list.add(entry);
        }
        Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>(){
            public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        });
        for(Map.Entry<Character, Integer> me : list) {
            int counts = 0;
            while(counts < me.getValue()) {
                System.out.print(me.getKey());
                counts++;
            }
        }
    }

}

代码执行结果如下:

 

posted on 2020-08-31 09:31  Jain_Shaw  阅读(974)  评论(0编辑  收藏  举报

导航