给出一个字符串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++; } } } }
代码执行结果如下: