如何按顺序迭代PriorityBlockingQueue

时间:2013-09-06 14:04:02

标签: java

除了其他自定义条件之外,我还有PriorityBlockingQueue<Shirts>使用FIFO(先进先出)比较器。在遵守优先权的同时,我只需要拔出绿色衬衫。我理解Queue的目标是它们用于“脱离顶层”的项目。 iterator()不遵守命令,所以我不能使用它。我应该完全使用不同的队列吗?我怎样才能迭代这些项目。

2 个答案:

答案 0 :(得分:8)

PriorityQueue.iterator()不遵守顺序,但检索操作轮询,删除,查看和元素访问队列头部的元素。因此,考虑到PriorityBlockingQueue不能包含null元素,您可以按顺序迭代元素

PriorityBlockingQueue<Shirts> q = ...
for (Shirts shirts; (shirts = q.poll()) != null; ) {
    ...      
}

另一种方式

     Shirts[] a = q.toArray(new Shirts[q.size()]);
     Arrays.sort(a);

现在你可以双向迭代

答案 1 :(得分:-1)

看一下javadoc,你应该可以使用“take”方法。

  

public E take()          抛出InterruptedException   从界面复制的描述:BlockingQueue   检索并删除此队列的头部,必要时等待元素可用。

只是在队列周围抛出一个for循环,瞧!您可以毫无问题地进行迭代。 :)

假设队列是严格的FIFO

如果它不是绿色衬衫

,您可以使用“put”将项目放回队列
  

public void put(E e)   将指定的元素插入此优先级队列。由于队列是无限制的,因此该方法永远不会阻塞。

这样非绿色衬衫仍会按顺序排列在队列中(一旦循环结束)。

您的设置方式

由于您使用的是PriorityBlockingQueue,因此将对象放回队列中可能最终会导致每次循环时将相同的项目从队列中拉出。您需要创建一个新队列,以便在检查项目是否为绿色衬衫时将其重新放回。

示例代码

PriorityBlockingQueue queue = new PriorityBlockingQueue();         PriorityBlockingQueue backupqueue = new PriorityBlockingQueue();

    queue.put("A");
    queue.put("B");
    queue.put("C");
    queue.put("D");

    List<String> saveList = new ArrayList<String>();
    int initialSize = queue.size();
    for(int i = 0; i < initialSize; i++){
        String element = queue.take();
        if(element.equals("C")){
            saveList.add(element);
        } else {
            backupqueue.put(element);
        }
    }