我使用优先级队列存储identity hashmap的元素(以便保留重复的密钥)。我想在优先级队列中根据键按降序添加identityhashmap元素,并打印它们的索引(从1开始)。但它没有给出正确的输出。
这是我的代码:
import java.util.*;
import java.lang.*;
class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
IdentityHashMap<Integer, Integer> hm = new IdentityHashMap<>();
PriorityQueue<Map.Entry<Integer, Integer>> p = new PriorityQueue<>(new my_Comparator());
int size = sc.nextInt();
int a[] = new int[size];
for (int index = 0; index < size; index++) {
a[index] = sc.nextInt();
hm.put(a[index], index + 1);
}
for (Map.Entry<Integer, Integer> temp : hm.entrySet()) {
p.add(temp);
}
while (p.size() != 0) {
Map.Entry<Integer, Integer> temp = p.poll();
System.out.print(temp.getValue() + " ");
}
System.out.println();
}
}
class my_Comparator implements Comparator<Map.Entry<Integer, Integer>> {
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
Integer i1 = o1.getKey();
Integer i2 = o2.getKey();
if (i1.equals(i2)) {
return o2.getValue().compareTo(o1.getValue());
}
return i2.compareTo(i1);
}
}
输入:
8
19 1 8 25 20 12 4 25
正确的输出如下:
8 4 5 1 6 3 7 2
这些是在优先级队列中按降序排序后的元素索引。
我的代码的输出是:
8 5 1 6 3 7 2
1条答案
按热度按时间lp0sw83n1#
问题的出现是因为您试图在输入中使用重复的值。
第一次输入25时,它会保存25的值和输入该值的索引。当最后再次输入25时,它会更新index.hashmap.put的值,如果键已经存在,则基本上会更新该值。因此,在原始hashmap中,只有7个条目存在。
要解决您的问题,请使用索引作为键,并将当前值作为hashmap的值。然后,当输入25时,它将存储这两个条目。这是给出所需输出的工作代码