---
# System prepended metadata

title: '1636. 按照频率将数组升序排序 [Easy][Hashtable]'

---

# 1636. 按照频率将数组升序排序 [Easy][Hashtable]
给你一个整数数组 nums ，请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同，请你按照数值本身将它们 降序 排序。 

请你返回排序后的数组。

 

示例 1：

```
输入：nums = [1,1,2,2,2,3]
输出：[3,1,1,2,2,2]
解释：'3' 频率为 1，'1' 频率为 2，'2' 频率为 3 。
```
示例 2：

```
输入：nums = [2,3,1,3,2]
输出：[1,3,3,2,2]
解释：'2' 和 '3' 频率都为 2 ，所以它们之间按照数值本身降序排序。
```
示例 3：
```

输入：nums = [-1,1,-6,4,5,-6,1,4,1]
输出：[5,-1,4,4,-6,-6,1,1,1]
```
 
題解思路：

根據題意，對nums進行詞頻統計，再以數值(map.keySet())的形式轉存到數組list中，其實key是對應nums的數值，再根據題目意思對數組進行排序，最後對list用遍歷方式構成答案。

```java=
class Solution {
    public int[] frequencySort(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        int n = nums.length;
        for(int i=0;i<n;i++){
            map.put(nums[i], map.getOrDefault(nums[i],0)+1);
          
        }
        List<Integer> list = new ArrayList<>(map.keySet());
        Collections.sort(list, (a,b)->{
            return (map.get(a) == map.get(b))?  b-a : map.get(a) - map.get(b);
        });
        int[] res = new int[nums.length];
        int i=0;
        for(int num :list){
            for(int j=0;j<map.get(num);j++){
                res[i++] = num;
            }
        }
        
        return res;
    }
}

```