すでに回答済みですが、コードの説明がよくないので、ここで試してみます。ソートする配列を次のようにします。int[] array = {4,4,2,2,2,2,3,3,1,1,6,7,5}
まず、各番号の頻度を数えましょう。
そのために、配列要素をKeyとして、頻度を値として持つHashMapデータ構造を作成します。出力を格納するために、出力リストを作成します。
HashMap<Integer,Integer> freqMap = new HashMap<>();
ArrayList<Integer> output = new ArrayList<>();
getOrDefault(key,defaultValue)
:これは、キーが見つからない場合は常にgetメソッドによって返されるnull以外の戻り値が必要なシナリオを処理するための便利な方法です。
コードに来る:
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;
}
}