数组去重和排序
题目描述
给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。
输入描述
一个数组
输出描述
去重排序后的数组
用例
输入 | 1,3,3,3,2,4,4,4,5 |
输出 | 3,4,1,2,5 |
备注 | 数组大小不超过100 数组元素值大小不超过100。 |
题目解析
使用List装入Map对象,每个map存储一个数字为键,值为键对应的出现的次数。最后再对List根据排序规则排序就可
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class T54 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
List<Integer> keyList = new ArrayList<>();// 记录顺序
Arrays.stream(input.split(",")).forEach(s -> {
Integer key = Integer.parseInt(s);
map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);
if (!keyList.contains(key)) {
keyList.add(key);
}
});
// System.out.println(map);
// System.out.println(keyList);
List<Map<Integer, Integer>> mapList = new ArrayList<>();
for (Integer key : keyList) {
Map<Integer, Integer> m = new HashMap<>();
m.put(key, map.get(key));
mapList.add(m);
}
mapList.sort(new Comparator<Map<Integer, Integer>>() {
@Override
public int compare(Map<Integer, Integer> m1, Map<Integer, Integer> m2) {
Integer v1 = m1.values().iterator().next();
Integer v2 = m2.values().iterator().next();
if (v1 > v2)
return -1;
if (v2 < v1)
return 1;
if (v2 == v1) {
// 取key顺序来判断
Integer k1 = m1.keySet().iterator().next();
Integer k2 = m2.keySet().iterator().next();
if (k1 > k2)
return 1;
if (k1 < k2)
return -1;
}
return 0;
}
});
mapList.forEach(m -> {
System.out.print(m.keySet().iterator().next() + ",");
});
}
}
代码运行示意图