Java语言利用Collections.sort对Map,List排序
- TreeMap排序
Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
public int compare(String o1, String o2) {
// 升序排序
return o1.compareTo(o2);
}
});
然后我惊讶的发现
1.在Map(interface)里面有一个内部接口Entry<K,Y>
2.HashMap中没有传入Comparator的构造方法,但是TreeMap有
3.HashMap和TreeMap在用法上有什么区别?
HashMap与TreeMap的区别
由于是按Key排序,还是不适合我现在需要的,我需要用value排序
- 将HashMap转换成List<Map.Entry<String, Integer>>,在借助Collections排序
451. 根据字符出现频率排序
public String frequencySort(String s) {
int len=s.length();
Map<Character,Integer> map = new HashMap<>();
for(int i=0;i<len;i++){
Character c = s.charAt(i);
map.put(c,map.getOrDefault(c,0)+1);
}
List<Map.Entry<Character,Integer>> hashList = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
Collections.sort(hashList,(a,b)->{
return b.getValue()-a.getValue();
});
StringBuilder sb = new StringBuilder();
for(Map.Entry<Character,Integer> entry : hashList){
Character key = entry.getKey();
int num = entry.getValue();
for(int i=0;i<num;i++){
sb.append(key);
}
}
return sb.toString();
}
//一次遍历获取char到数量的映射,并且记录最大出现的次数
//二次遍历按照最大次数来构建桶排序
//遍历桶排序的结果构建答案
public String frequencySort(String s) {
int[] cnt = new int[128];
int maxCount=0;
for(int i=0;i<s.length();i++){
Character c = s.charAt(i);
cnt[c]++;
maxCount=Math.max(maxCount,cnt[c]);
}
Map<Integer,List<Integer>> map = new TreeMap<>((a,b)->{
return b-a;
});
for(int i=0;i<128;i++){
int key = cnt[i];
if(key!=0){
List<Integer> temp = null;
if(map.containsKey(key)) temp = map.get(key);
else temp = new ArrayList<>();
temp.add(i);
map.put(key,temp);
}
}
StringBuilder sb = new StringBuilder();
for(Map.Entry<Integer,List<Integer>> entry:map.entrySet()){
Integer i = entry.getKey();
List<Integer> values = entry.getValue();
for(int value:values){
for(int k=0;k<i;k++){
sb.append((char)value);
}
}
}
return sb.toString();
}