给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。 请你返回排序后的数组。
主要考察的是哈希映射的自定义排序,关于对多个数组的排序可以参考下面这篇文章Java 通过Index(索引)数组同时对多个数组进行排序-CJavaPy
直接附上一位大佬的题解
class Solution {
public int[] frequencySort(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num: nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
return Arrays.stream(nums).boxed().sorted((a, b) -> {
if (map.get(a) != map.get(b)) {
return map.get(a) - map.get(b);
}
return b - a;
}).mapToInt(Integer::valueOf).toArray();
}
}
作者:himymBen
链接:https://leetcode.cn/problems/sort-array-by-increasing-frequency/solution/p-by-himymben-r24t/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
public class test {
public static void main(String[] args) {
int nums[]={1,1,2,2,2,3};
int n=nums.length;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=0;i<n;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);//getOrDefault是获取指定的key值对应的value,如果不存在该key,返回默认值
}
List<int []> l1 = new ArrayList<>();
for(int key:map.keySet()){
// l1.add(new int[]{key,map.get(key)});
// 未优化时是
int cc[]={key,map.get(key)};
l1.add(cc);
}
// 未排序前
for (int[] a :
l1) {
for (int i :
a) {
System.out.print(i+" ");
}
System.out.println();
}
// 关键在于此:
l1.sort((a, b) -> a[1] != b[1] ? a[1] - b[1] : b[0] - a[0]);
System.out.println("=================================");
// 排序后
for (int[] a :
l1) {
for (int i :
a) {
System.out.print(i+" ");
}
System.out.println();
}
}
}