题目:给定一个字符串 s
,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
题目思路:
需要计算每个字符的频率,然后按照频率的大小排序,最后输出。
首先我的解法把这道题复杂化了,主要是考虑Map怎么根据value值进行排序?或者根据Key排序?
算法思路:
1.利用HashMap计算每个字符的频次;
2.将Map转换为List ,利用Collections工具类调用Sort方法,再利用匿名内部类Comparator的compare方法,将Map按照Value排序
List<Map.Entry<Character,Integer>> entryList = new ArrayList(map.entrySet());
//利用Collections的sort对list排序
Collections.sort(entryList, 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();
}
});
3.遍历按照Value排序后的Map,依次添加到StringBuffer中。
StringBuffer sb = new StringBuffer();
for (Map.Entry<Character,Integer> e : entryList){
for (int i = 0;i < e.getValue();i++){
sb.append(e.getKey());
}
}
4.将sb转换为String输出。
return sb.toString();
最后完整代码
class Solution {
public String frequencySort(String s) {
Map<Object, Integer> map = new HashMap<>();
char[] sChar = s.toCharArray();
for (char c : sChar){
map.put(c,map.getOrDefault(c,0)+1);
}
//将Map按照value值排序
List<Map.Entry<Character,Integer>> entryList = new ArrayList(map.entrySet());
//利用Collections的sort对list排序
Collections.sort(entryList, 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();
}
});
StringBuffer sb = new StringBuffer();
for (Map.Entry<Character,Integer> e : entryList){
for (int i = 0;i < e.getValue();i++){
sb.append(e.getKey());
}
}
return sb.toString();
}
}