gpt4 book ai didi

java - 具有内部比较器类的 PriorityQueue

转载 作者:行者123 更新时间:2023-12-02 08:55:55 27 4
gpt4 key购买 nike

我尝试使用内部比较器类以降序实现优先级队列,但是当我打印优先级队列时,我没有得到正确的结果。当我尝试使用 Collection.sort 的相同比较器代码来实现列表排序(具有相同的值)时。我得到了正确的结果。您能解释一下吗?

//int[] nums = {50,10, 20, 30, 40};
public static void TestComparatorcomparemethod(int[] nums){
PriorityQueue<Integer> pq= new PriorityQueue<>(nums.length,new Comparator<Integer>(){
@Override
public int compare(Integer o1,Integer o2){
int a = (int)o1;
int b = (int)o2;
if (a > b)
return -1;
else if (a==b)
return 0;
else
return 1;
}
});
for (int node:nums){
pq.add(node);}
System.out.println("pq values are " + pq);
}

以上代码的答案是pq 值为 [50, 40, 20, 10, 30]

        List<Integer> al = new ArrayList<>();
al.add(50);
al.add(10);
al.add(20);
al.add(30);
al.add(40);
Collections.sort(al, new Comparator<Integer>(){
@Override
public int compare(Integer o1,Integer o2){
int a = (int)o1;
int b = (int)o2;
if (a > b)
return -1;
else if (a==b)
return 0;
else
return 1;
}
} );
System.out.println("The arraylist values are: " + al);

以上代码的答案是数组值为:[50, 40, 30, 20, 10]

最佳答案

对于优先级队列,意外的顺序 [50, 40, 20, 10, 30] 是可以的(预期)。因为迭代优先级队列并不能保证排序顺序。但如果您使用 peek/poll,您将看到返回了预期值。

来自DOCUMENTATION :

This class and its iterator implement all of the optional methods of the Collection and Iterator interfaces. The Iterator provided in method iterator() is not guaranteed to traverse the elements of the priority queue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray()).

您的比较器代码没问题。如果您确实需要按顺序打印值,请尝试:

 System.out.println("pq values are " + Arrays.sort(pq.toArray());

关于java - 具有内部比较器类的 PriorityQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60483724/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com