题目描述
给定一个字符串 " happy ",将字符串按照字符出现次数降序输出
输出:pphay
import java.util.*;
class Solution {
public static void main(String[] args) {
String s = "happy";
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
int count = map.get(s.charAt(i));
map.put(s.charAt(i), count + 1);
} else {
map.put(s.charAt(i), 1);
}
}
/*第一种方法,先sort再forEach*/
// 对Value降序,把HashMap变成List
List<Map.Entry<Character, Integer>> newMap = new ArrayList<>(map.entrySet());
//给sort方法自定义一个比较器,重写compare方法
Collections.sort(newMap, new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
// 也可以根据key来排序
return o2.getValue() - o1.getValue(); //o1-o2升序,o2-o1降序
}
});
}
// 使用lambda表达式代替第一种方法中的匿名内部类
Collections.sort(newMap,(o1,o2) -> o2.getValue().compareTo(o1.getValue())); //也可以使用compareTo方法来代替减法,o1.compareTo(o2)升序,o2.compareTo(o1)降序
//再对newMap进行遍历,此时newMap是List类型的
newMap.forEach(
entry -> {
for (int i = 0;i < entry.getValue();i++)
System.out.print(entry.getKey());
}
);
/*第二种方法,使用stream,sort,forEach一气呵成*/
newMap.stream().sorted(new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
return o1.getValue().compareTo(o2.getValue()) * -1;
}
}).forEach(
entry-> {
for (int i = 0;i < entry.getValue();i++)
System.out.print(entry.getKey());
}
);
StringBuilder builder = new StringBuilder();
/*使用lambda表达式代替第二种方法的匿名内部类*/
newMap.stream()
.sorted((o1,o2) -> o1.getValue().compareTo(o2.getValue()) * -1)
.forEach(entry -> {
for (int i = 0;i < entry.getValue();i++) {
// System.out.print(entry.getKey());
builder.append(entry.getKey());
}
});
}