题目描述:给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
解题思路:很容易想到使用Map<Character,Integer>存储字符和对应出现的次数,然后根据出现的次数排序,出现的多的写在前面。 但是Map又不能直接排序,需要能想到把Map的key(也就是字符表)存放到List中,然后对List进行排序,根据List中元素在Map中的value排序。
public String frequencySort(String s) {
Map<Character, Integer> map = new HashMap<>();
char[] chars = s.toCharArray();
for (char ch : chars) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
List<Character> list = new ArrayList<>(map.keySet());
Collections.sort(list, new Comparator<Character>() {
@Override
public int compare(Character a, Character b) {
return map.get(b) - map.get(a);
}
});
// 以上几行可以试用Lamda表达式更简洁
// Collections.sort(list, (a, b) -> map.get(b) - map.get(a));
StringBuffer buffer = new StringBuffer();
int size = list.size();
for (int i = 0; i < size; i++) {
char c = list.get(i);
int times = map.get(c);
for (int j = 0; j < times; j++) {
buffer.append(c);
}
}
return buffer.toString();
}
|