//给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
//
//请你返回排序后的数组。
这是个字节的算法面试题
import java.util.*;
//给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
//
//请你返回排序后的数组。
public class Num1636_ArraySort {
public static int[] frequencySort(int[] nums){
// 先用hashmap统计出一共每个数出现的频率
HashMap<Integer,Integer> fre = new HashMap<>();
for(Integer i:nums){
fre.put(i,fre.getOrDefault(i,0)+1);
}
System.out.println(fre);
// 然后用list进行自定义排序,频率升序、数值降序
// 注意这里的新建怎么写的
List<Map.Entry<Integer,Integer>> list = new ArrayList<>(fre.entrySet());
// Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
// @Override
// public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
//// 这里是Integer 引用数据类型的比较用 equals比较好,==限制得太多了
// if(o1.getValue().equals(o2.getValue())){
// return o2.getKey().compareTo(o1.getKey());
// }else{
// return o1.getValue().compareTo(o2.getValue());
// }
// }
// });
// lambda 表达式
Collections.sort(list,(Map.Entry<Integer,Integer> o1,Map.Entry<Integer,Integer> o2)->{
if(o1.getValue().equals(o2.getValue())){
return o2.getKey().compareTo(o1.getKey());
}else{
return o1.getValue().compareTo(o2.getValue());
}
});
System.out.println(list);
// 然后把list,转化为数组输出
int[] result = new int[nums.length];
int m=0;
for(int i=0;i<list.size();i++){
for(int j=0;j<list.get(i).getValue();j++){
result[m]=list.get(i).getKey();
m++;
}
}
return result;
}
public static void main(String[] args) {
int[] a = {2,3,1,3,4,3,1,5};
for(int num:a){
System.out.print(num+",");
}
int[] b = frequencySort(a);
for(int num:b){
System.out.print(num+",");
}
}
}