为什么PriorityQueue peek()返回错误的最大值?

时间:2015-08-20 14:34:29

标签: java priority-queue

我使用PriorityQueue来获取最大整数,但我无法弄清楚为什么第一种方法返回正确的最大整数但第二种方法没有。第二种方法试图更新目标项的大数;但是当我在调用update方法后尝试peek()方法时,它仍会在更新后打印出旧的最大数字而不是新的最大数字。

这是我的代码:

void add(String name, int number) {
    Item item = new Item(name, number, allItems.size());
    allItems.add(item);
    hashMap.put(name, item);
}

void update(String name, int number) {
    Item item = hashMap.get(name);

    // EDITED: 
    allItems.remove(item);

    item.setNumber(item.getNumber() + number);
    allItems.add(item);
    hashMap.put(name, item);    
}

已编辑:似乎只有在我从allItems中删除了目标项目时才会起作用(请参阅更新方法中的EDITED)。为什么会这样?

class Item implements Comparable<Item>{
        private String name;
        private int number;
        private int arrived;

        public Item(String name, int number, int arrived) {
            this.name = name;
            this.number = number;
            this.arrived = arrived;
        }

        @Override
        public int compareTo(Item o) {

            int x = this.getNumber();
            int y = o.getNumber();

            if (y > x) return 1;
            if (y < x) return -1;


            if (this.arrived > o.arrived) return 1;
            if (this.arrived < o.arrived) return -1;

            return 0;
        }

    }

1 个答案:

答案 0 :(得分:3)

最有可能的是,Comparable的实施不正确。

Comparable PriorityQueue实施是Comparable用来了解如何根据字段值对项目进行排序的方法。您必须在降低顺序中实施-1。如果其他项目更大,您希望它返回1,如果项目更大,则返回Item;在你的代码中,你正在做相反的事情。换句话说,请确保您的public class Item implements Comparable<Item> { private int number; private int arrived; // the rest of your code public int compareTo(Item other) { int numberCompare = Integer.compare(other.number, this.number); if (numberCompare == 0) { return Integer.compare(other.arrived, this.arrived); } else { return numberCompare; } } } 类定义如下所示:

Item

如果您不想更改Comparator的班级定义,也可以使用PriorityQueue(int initialCapacity, Comparator comparator)

根据Javadoc for PriorityQueue

  

基于优先级堆的无界优先级队列。优先级队列的元素按照natural ordering 排序,或者在队列构造时提供null,具体取决于使用的构造函数。优先级队列不允许ClassCastException个元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致{{1}})。