首页 > 解决方案 > 什么是根据元素频率对数组元素进行排序的最有效方法

问题描述

我有一个数组,我使用以下方法根据元素的频率对数组进行排序。

  1. 我将元素及其各自的频率存储为键值对。
  2. 我将值(元素的频率)存储在一个数组中
  3. 我按降序对数组进行排序
  4. 我打印与值对应的键
public void sort(int a[])
    {
        HashMap<Integer, Integer> hs = new HashMap<>();

        for(int i = 0;i<a.length;i++)
        {
            Integer j = new Integer(a[i]);
            if(hs.containsKey(j))
                hs.put(j,hs.get(j)+1);
            else
                hs.put(j,1);
        }
        Integer g[] = new Integer[hs.size()];
        int v= 0;
        for(Map.Entry<Integer,Integer> entry : hs.entrySet())
            g[v++] = entry.getValue();

        for(int i = 0;i<v-1;i++)
            {
                for(int j=i+1;j<v;j++)
                {
                    if(g[j]>g[i])
                    {
                        int temp = g[j];
                        g[j] = g[i];
                        g[i] = temp;
                    }
                }
            }
   int i=0;
    while(i != v){
    for(Map.Entry<Integer,Integer> entry : hs.entrySet())
    {
            if(g[i] == entry.getValue())
            System.out.println(entry.getKey() +" = "+ g[i++]);
    }
    }


    }

是否有任何简短有效的方法可以做到这一点,请提出建议。

标签: javaarraysalgorithmsortinghashmap

解决方案


您可以从地图的 entrySet 创建一个列表,然后使用自定义比较器对列表进行排序,该比较器根据地图的值进行比较。

  1. 从 Map 的 entrySet 创建一个列表 - 使用将另一个集合作为参数的构造函数。
  2. 对列表进行排序 - Collections.sort 使用 Comparator 实现。

推荐阅读