JAVA對map按照值進行自定義排序
阿新 • • 發佈:2019-01-03
以POJ的一道題為例http://poj.org/problem?id=2945
Find the ClonesTime Limit: 5000MS | Memory Limit: 65536K |
Total Submissions: 8291 | Accepted: 3121 |
Description
Doubleville, a small town in Texas, was attacked by the aliens. They have abducted some of the residents and taken them to the a spaceship orbiting around earth. After some (quite unpleasant) human experiments, the aliens cloned the victims, and released multiple copies of them back in Doubleville. So now it might happen that there are 6 identical person named Hugh F. Bumblebee: the original person and its 5 copies. The Federal Bureau of Unauthorized Cloning (FBUC) charged you with the task of determining how many copies were made from each person. To help you in your task, FBUC have collected a DNA sample from each person. All copies of the same person have the same DNA sequence, and different people have different sequences (we know that there are no identical twins in the town, this is not an issue).Input
The input is terminated by a block with n = m = 0 .
Output
Sample Input
9 6 AAAAAA ACACAC GTTTTG ACACAC GTTTTG ACACAC ACACAC TCCCCC TCCCCC 0 0
Sample Output
1 2 0 1 0 0 0 0 0
Hint
Huge input file, 'scanf' recommended to avoid TLE.Source
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(true){
int n = scan.nextInt();
int m = scan.nextInt();
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i=0;i<n;i++){
String str = scan.next();
if(!map.containsKey(str)){
map.put(str, 1);
}else{
map.put(str, map.get(str)+1);
}
}
//對MAP按照值進行自定義排序
List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
int[] k = new int[n];
for(Map.Entry<String, Integer> mapp:list){
int temp = mapp.getValue()-1;
k[temp]++;
}
for(int i=0;i<n;i++){
System.out.println(k[i]);
}
}
}
}