已经回答了,但是代码没有很好的解释。所以我会在这里尝试。设要排序的数组为:int[] array = {4,4,2,2,2,2,3,3,1,1,6,7,5}
首先让我们计算每个数字的频率:
为此,我们将创建一个 HashMap 数据结构,它将数组元素作为键,将它们的频率作为值。为了存储我们的输出,我们将有一个输出列表。
HashMap<Integer,Integer> freqMap = new HashMap<>();
ArrayList<Integer> output = new ArrayList<>();
getOrDefault(key,defaultValue)
:这是一种方便的方法来处理我们想要返回的值而不是 null 的情况,只要找不到键,get 方法就会返回该值。
来到代码:
for(int current : array)
{
int count = freqMap.getOrDefault(current,0); // if arrayelement is encountered first time it returns 0 otherwise it returns the actual count
freqMap.put(current,count++); // we increase the count by one and put it in the map
output.add(current); // we also add the element in the list.
}
现在我们已经在 HashMap 中用它们的频率映射了元素。
- 2 comes four times
- 3 comes two times
- 4 comes two times
- 5,6 and 7 comes one time.
现在我们需要根据频率对输出列表进行排序。为此,我们实现了comparator interface
. 在这个接口中我们有一个方法
public int compare(Object obj1, Object obj2) //It compares the first object with the second object.
所以我们创建一个类SortComparator
来实现这个接口并创建一个comp
类的对象SortComparator
。
SortComparator comp = new SortComparator(freqMap);
Collections.sort(output,comp);
for(Integer i : output)
{
System.out.print(i + " ");
}
这是 Comparator 接口的实现:
class SortComparator implements Comparator<Integer>
{
private final Map<Integer,Integer> freqMap;
SortComparator(Map<Integer,Integer>freqMap)
{
this.freqMap = freqMap;
}
public int compare(Integer k1,Integer k2)
{
//Comparing by frequency
int freqCompare = freqMap.get(k2).compareTo(freqMap.get(k1));
//Comparing by value
int valueCompare = k2.compareTo(k1);
if(freqCompare == 0)//frequency of both k1 and k2 is same then
{
return valueCompare;
}
else
{
return freqCompare;
}
}