队列界面混乱

时间:2016-03-17 21:10:25

标签: java queue priority-queue comparator

问题1:

以下输出为1,2,3

Queue<Integer> q1 = new PriorityQueue<Integer>();
    q1.add(1);
    q1.add(3);
    q1.add(2);
    System.out.print(pq.poll());
    System.out.print(pq.poll());
    System.out.print(pq.poll());

以下输出为1,3,2

Queue<Integer> q2 = new LinkedList<Integer>();
    q3.add(1);
    q3.add(3);
    q3.add(2);
    System.out.print(q3.poll());
    System.out.print(q3.poll());
    System.out.print(q3.poll());

为什么呢?既然他们都在实现Queue接口但是有不同的行为?我认为无论实现类是什么,如果它们实现相同的接口,它的行为必须是相同的。

问题2:

假设我使用以下

定义一个类
class process {
  int exeTime;
  int arrTime;
  process(int, arr, int exe) {
    arrTime=arr;
    exeTime = exe;
  }
}

在以下代码行中覆盖compare方法有什么影响?为什么?

PriorityQueue<process> pq2 = new PriorityQueue<process>(new Comparator<process>() {
        @Override
        public int compare(process p1, process p2) {
            if (p1.exeTime == p2.exeTime)
                return p1.arrTime - p2.arrTime;
            return p1.exeTime - p2.exeTime;
        }
    });

3 个答案:

答案 0 :(得分:2)

  1. 是的,这两个类有不同的行为,但它与Queue接口并不矛盾。
  2. Javadocs for add in Queue并未声明任何特定订单:

      

    如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此队列,成功时返回true,如果当前没有可用空间则抛出IllegalStateException。

    Javadocs for poll in Queue可能表明它从队列的头部开始,但是add并没有说出头部应该是什么元素。

      

    检索并删除此队列的头部,如果此队列为空,则返回null。

    由于Queue没有指定任何特定的顺序,因此每个实现类都可以自行定义它。

    1. 你不能凌驾于任何事物上;您是根据Javadocs for that constructor指定用于在Comparator中订购元素的PriorityQueue类。
    2.   

      使用默认初始容量创建PriorityQueue,并根据指定的比较器对其元素进行排序。

答案 1 :(得分:2)

完全没有。阅读Queue interface documentation

  

队列通常(但不一定)以FIFO(先进先出)方式对元素进行排序。除了优先级队列之外,优先级队列根据提供的比较器对元素进行排序,或者元素&#39;自然排序和LIFO队列(或堆栈),它们对元素LIFO(后进先出)进行排序。无论使用什么顺序,队列的头部都是通过调用remove()或poll()来删除的元素。在FIFO队列中,所有新元素都插入队列的尾部。其他类型的队列可能使用不同的放置规则。每个Queue实现都必须指定其排序属性。

Queue的实现可以使用它选择的任何顺序。

2)如果exeTime中存在平局,则会先arrTime排序,然后exeTime排序。

答案 2 :(得分:2)

  

我认为无论实现类是什么,如果它们实现相同的接口,它的行为必须相同。

这不正确。所有实现所要做的就是满足接口的合同。对于Queue接口,行为可以像堆栈(先进先出),就像传统队列(先进先出),或者返回基于其他系统的元素。

PriorityQueue根据Comparator给出的优先级返回元素。如果compare(a, b)返回负整数,则a的优先级高于b。如果compare(a, b)返回一个正整数,那就是另一种方式。如果compare(a, b)返回0,则ab具有相同的优先级。