假设我有shoeCollection
课程,同时拥有鞋子尺码和鞋子品牌。如何修改比较器,使其根据鞋码对priorityQueue
进行排序?
我知道优先级队列已经有一个内置比较器,但由于我的对象不是Integer或Double,我想我需要编写自己的。
这是我现在的比较器
static class ShoeComparator implements Comparator<shoes>
{
@Override
public int compare(shoes x, shoes y)
{
if(x.getID() > y.getID()){
return 1;
}
if(x.getID() < y.getID()){
return -1;
}
return 0;
}
}
然后我用以下
声明一个新的Shoe优先级队列private static Comparator<shoes> comparator = new shoeComparator();
private static PriorityQueue<shoes> list = new PriorityQueue<shoes>(10001, comparator);
我尝试添加一些鞋子,看看它会怎样结果
list.add(new shoes(56.0, "Nike"));
list.add(new shoes(47.0, "Addidas"));
list.add(new shoes(93.0, "Puma"));
list.add(new shoes(3.0, "Vans"));
在Main
中测试它for(int i = 0; i < list.size(); i++){
System.out.println(list.poll().getID());
}
//3.0 47.0
仅注册了3.0和47.0的ID。我的比较器有问题吗?
似乎它只返回前2个ID并忽略其余的ID,但是当我调用list.size()
时它返回4,这是正确的。我找不到问题。
答案 0 :(得分:0)
您可以在constructor放置比较器代码中创建PriorityQueue
。
示例:
PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>(10, new Comparator<Integer>()
{
@Override
public int compare(Integer o1, Integer o2)
{
// Logic here
return 0;
}
});
答案 1 :(得分:0)
您可以在PriorityQueue实例化期间内联创建自定义比较器。
假设您的Shoe类如下所示:
public class Shoe {
private double size;
private String brand;
public Shoe(double size, String brand) {
this.size = size;
this.brand = brand;
}
public double getSize() {
return size;
}
}
您可以通过执行以下操作来创建一个PriorityQueue,以按尺寸对鞋子进行排序:
PriorityQueue<Shoe> shoePQ = new PriorityQueue<>(10000, new Comparator<Shoe>() {
@Override
public int compare(Shoe s1, Shoe s2) {
return s1.getSize()-s2.getSize();
});
}
这将从小到大订购鞋子。如果您想要相反的顺序,则可以将compare()
的主体替换为return s2.getSize()-s1.getSize();