思路:
- 首要统计数组中每个元素出现的频次以及出现顺序(以第一次出现的为准)
- 创建一个结构体,包含: val count order
- 构造一个比较器确定比较规则(按照出现次数多少从大到小排序,出现次数相同则按照出现顺序order排序)
public static int[] fx(int[] arr) {
//收集节点信息
HashMap<Integer, Node> map = new HashMap<>();
int count = 0;
for (int val : arr) {
if (!map.containsKey(val)) {
Node node = new Node(val, 1, count);
map.put(val, node);
count++;
} else {
Node node = map.get(val);
node.count = node.count + 1;
map.put(val, node);
}
}
Collection<Node> values = map.values();
Node[] nodes = values.toArray(new Node[0]);
//生成信息后的原始节点信息
for (Node n : nodes) {
System.out.println(n.val + "\t" + n.count + "\t" + n.order);
}
System.out.println();
Arrays.sort(nodes, new NodeComparator());
//排序后的节点
for (Node node : nodes) {
System.out.println(node.val + "\t" + node.count + "\t" + node.order);
}
System.out.println();
int[] res = new int[count];
for (int i = 0; i < res.length; i++) {
res[i] = nodes[i].val;
}
System.out.println(Arrays.toString(res));
return res;
}
private static class Node {
public int val; //值
public int count; //值重复次数
public int order; //顺序
public Node(int val, int count, int order) {
this.val = val;
this.count = count;
this.order = order;
}
}
private static class NodeComparator implements Comparator<Node> {
@Override
public int compare(Node o1, Node o2) {
//构建比较器,统计次不同时按次数比较否则按出现顺序排序
return o1.count != o2.count ? o2.count - o1.count : o1.order - o2.order;
}
}