需要对Map<Character, Integer> 类型的数据根据value值进行排序,思路,将所有元素先放到List中,使用Collection接口的sort进行排序。
如有
String s = "abchhhhhhhhhj";
Map<Character, Integer> fre = new HashMap<>(); int len = s.length(); for (int i = 0; i < len; i++) { int count = fre.getOrDefault(s.charAt(i), 0) + 1; fre.put(s.charAt(i), count); }
List<Map.Entry<Character, Integer>> List = new ArrayList<Map.Entry<Character, Integer>>(fre.entrySet()); Collections.sort(List, new Comparator<Map.Entry<Character, Integer>>() { @Override public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) { return o2.getValue() - o1.getValue(); } });StringBuilder sb = new StringBuilder();Character c; int nums; for (int i = 0; i < List.size(); i++) { c = List.get(i).getKey(); nums = List.get(i).getValue(); for (int j = 0; j < nums; j++) { sb.append(c); } //System.out.println("character " + c + " nums " + nums); }String result = sb.toString();
根据value排序,实现了字符串按字符出现的次数进行降序排序,得到新的字符串。
上面核心代码为:
Collections.sort(List, new Comparator<Map.Entry<Character, Integer>>() { @Override public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) { return o2.getValue() - o1.getValue(); } });
其实更加简洁可以用一行代码来实现:使用lamda表达式
List.sort((Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2)->(o2.getValue() - o1.getValue()));