Java PriorityQueue比较器

时间:2014-03-16 21:18:24

标签: java

假设我有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,这是正确的。我找不到问题。

2 个答案:

答案 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();