南大高级算法作业之按数值个数排序

input:

1

5

5 5 4 6 4

output:

4 4 5 5 6

代码(value逆序排序部分参考了https://www.jianshu.com/p/240875d9f70a):

import java.util.*;
import java.util.Map.Entry;

public class Main {

    public static void main(String[] args) {

    	Scanner scan = new Scanner(System.in);

		int e_num = Integer.parseInt(scan.nextLine());//测试数

		while(e_num>0){

			int n = Integer.parseInt(scan.nextLine());//数字数目

			String num[] = scan.nextLine().split(" ");//初始数组

			Map<String, Integer> map = new TreeMap<String, Integer>();

			//插入Scanner所得元素
			for(int k = 0;k<n;k++){

				if(map.containsKey(num[k])){

					map.put(num[k],map.get(num[k])+1);

				}

				else{

					map.put(num[k], 1);

				}

			}

			int count = 0;

			String[] keynum = new String[map.size()];

			//这里将map.entrySet()转换成list
			List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());

			//然后通过比较器来实现排序
			Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {

			//按value降序排序
			public int compare(Entry<String, Integer> o1,Entry<String, Integer> o2) {	

				return o2.getValue().compareTo(o1.getValue());	

				}

			});

			for(Map.Entry<String,Integer> mapping:list){

				keynum[count] = mapping.getKey();

				count ++;

			}

			String[] result = new String[n];//将有序map键传入数组

			int p = 0;

			for(int i = 0;i < keynum.length;i ++){

				String temp = keynum[i];

				for(int j = 0;j < map.get(temp);j ++){

					result[p] = temp;

					p++;

				}	

			}

			for(int i = 0;i < n;i ++){

				if(i == n-1){	

					System.out.print(result[i]);

				}else{
					
					System.out.print(result[i]+" ");

				}

			}
			
			System.out.println();

			e_num --;

		}

    }

}
发布了36 篇原创文章 · 获赞 2 · 访问量 2023

猜你喜欢

转载自blog.csdn.net/fumonster/article/details/101486080