CCF201503 數字排序(JAVA)
阿新 • • 發佈:2018-11-23
問題描述: | 問題描述 給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。 輸入格式 輸入的第一行包含一個整數n,表示給定數字的個數。 輸出格式 輸出多行,每行包含兩個整數,分別表示一個給定的整數和它出現的次數。按出現次數遞減的順序輸出。如果兩個整數出現的次數一樣多,則先輸出值較小的,然後輸出值較大的。 樣例輸入 12 樣例輸出 3 4 評測用例規模與約定 1 ≤ n 思想:建立一個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()); } } }