【发布时间】:2020-05-06 10:39:05
【问题描述】:
我有一个数组,我使用以下方法根据元素的频率对数组进行排序。
- 我将元素及其各自的频率存储为键值对。
- 我将值(元素的频率)存储在一个数组中
- 我按降序对数组进行排序
- 我打印与值对应的键
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++]);
}
}
}
请问有什么简单有效的方法吗?
【问题讨论】:
-
允许使用 java 8 及以上版本??
-
Arrays.stream(yourArray).boxed().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) -
@Michael ,
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))最终会出现在Map<Integer, Long>,但 OP 需要Map<Integer, Integer>所以在这里使用Collectors.reducing(0, e -> 1, Integer::sum)是最好的。 -
@VishwaRatna OP 并不“需要”
Map<Integer, Integer>- 目标是按指定顺序对数组进行排序,而不是创建特定类型的映射。 map 是一种辅助数据结构,如果这样可以简化代码,可以轻松更改为Map<Integer, Long>类型。
标签: java arrays algorithm sorting hashmap