問題描述: |
問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸入格式 輸入的第一行包含一個整數n,表示給定數字的個數。 輸出格式 輸出多行,每行包含兩個整數,分別表示一個給定的整數和它出現的次數。按出現次數遞減的順序輸出。如果兩個整數出現的次數一樣多,則先輸出值較小的,然後輸出值較大的。 樣例輸入 12 樣例輸出 3 4 評測用例規模與約定 1 ≤ n ≤ 1000,給出的數都是不超過1000的非負整數。 思想:創建一個map,鍵爲整數,值爲該整數出現次數。對輸入數據進行掃描時將數據按鍵位置存儲在map中,每輸入一次map中已有的重複數據對應的值即出現的次數就遞增,同時將該map的鍵與值的映射裝入list集合中並重新定義list中的比較器,根據題中的需求制定相應的比較方式。 |
package numberSorting;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
@SuppressWarnings("resource")
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//輸入整數的個數
Map<Integer, Integer> m=new HashMap<>();//鍵爲整數,值爲該整數出現次數
for(int i=0;i<n;i++)
{
int key=sc.nextInt();
if(!m.containsKey(key))//判斷該整數在map中是否存在,沒有即創建
m.put(key, 0);
m.put(key, m.get(key)+1);//將該整數出現次數加一
}
ArrayList<Map.Entry<Integer, Integer>> list=new ArrayList<>(m.entrySet());
//將該map的映射裝入list集合中
Collections.sort(list,new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Entry<Integer, Integer> o1,
Entry<Integer, Integer> o2) {
if(o1.getValue()>o2.getValue())//比較兩整數出現次數(由大到小排序)
return -1;
else if(o1.getValue()<o2.getValue())
return 1;
else//當兩整數出現次數相同時
if(o1.getKey()>o2.getKey())//比較兩整數自身的大小(由小到大排序)
return 1;
else
return -1;
}
});
for(Map.Entry<Integer, Integer> kv:list)
{
System.out.println(kv.getKey()+" "+kv.getValue());
}
}
}