6

除了其他自定义条件外,我还有一个PriorityBlockingQueue<Shirts>使用 FIFO(先进先出)比较器。在服从优先权的同时,我只需要拿出绿色衬衫。我了解队列的目标是它们旨在用于“从顶部取下”的项目。iterator()不服从命令,所以我不能使用它。我应该完全使用不同的队列吗?我如何迭代这些项目。

4

2 回答 2

8

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

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

另一种方式

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

现在您可以双向迭代

于 2013-09-06T14:15:06.143 回答
-1

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

public E take() throws InterruptedException 从接口复制的描述:BlockingQueue 检索并删除此队列的头部,如有必要,等待元素变为可用。

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

假设队列是严格的 FIFO

然后,如果它不是绿色衬衫,您可以使用“put”将项目放回队列中

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

这样,非绿色衬衫仍将按顺序排在队列中(一旦循环完成)。

设置方式

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

示例代码

PriorityBlockingQueue queue = new PriorityBlockingQueue(); PriorityBlockingQueue 备份队列 = 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);
        }
    }
于 2013-09-06T14:08:48.463 回答