java - 什么是根据元素频率对数组元素进行排序的最有效方法
问题描述
我有一个数组,我使用以下方法根据元素的频率对数组进行排序。
- 我将元素及其各自的频率存储为键值对。
- 我将值(元素的频率)存储在一个数组中
- 我按降序对数组进行排序
- 我打印与值对应的键
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++]);
}
}
}
是否有任何简短有效的方法可以做到这一点,请提出建议。
解决方案
您可以从地图的 entrySet 创建一个列表,然后使用自定义比较器对列表进行排序,该比较器根据地图的值进行比较。
- 从 Map 的 entrySet 创建一个列表 - 使用将另一个集合作为参数的构造函数。
- 对列表进行排序 - Collections.sort 使用 Comparator 实现。