1. 程式人生 > >CCF201503 數字排序(JAVA)

CCF201503 數字排序(JAVA)

 

問題描述:

問題描述

  給定n個整數,請統計出每個整數出現的次數,按出現次數從多到少的順序輸出。

輸入格式

  輸入的第一行包含一個整數n,表示給定數字的個數。
  第二行包含n個整數,相鄰的整數之間用一個空格分隔,表示所給定的整數。

輸出格式

  輸出多行,每行包含兩個整數,分別表示一個給定的整數和它出現的次數。按出現次數遞減的順序輸出。如果兩個整數出現的次數一樣多,則先輸出值較小的,然後輸出值較大的。

樣例輸入

12
5 2 3 3 1 3 4 2 5 2 3 5

樣例輸出

3 4
2 3
5 3
1 1
4 1

評測用例規模與約定

  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());
		}
	}

}