在Java中从队列中删除项

在Java中从队列中删除项,java,Java,假设Java中有一个对象队列,如下所示: Queue<Element> q = new LinkedList<>(); 在我的程序中,我可能会将多个Element类型的对象放入队列中,其中许多对象可能具有相同的x和y。因此,假设我的队列包含多个(x=1,y=2)对象,我只找到一个x=1和y=2的对象,而且元素移动比所有元素都好。有没有办法从队列中找到并删除所有这些元素?你不能。不支持这一点 编辑:但您已经有了链接列表。如果要进行随机访问,为什么只使用其队列方法Linke

假设Java中有一个对象队列,如下所示:

Queue<Element> q = new LinkedList<>();
在我的程序中,我可能会将多个Element类型的对象放入队列中,其中许多对象可能具有相同的x和y。因此,假设我的队列包含多个(x=1,y=2)对象,我只找到一个x=1和y=2的对象,而且元素移动比所有元素都好。有没有办法从队列中找到并删除所有这些元素?

你不能。不支持这一点

编辑:但您已经有了
链接列表
。如果要进行随机访问,为什么只使用其
队列
方法
LinkedList
实现了
List
Queue
,只需保留它即可

LinkedList ll=new LinkedList();

迭代所有值,并删除所有移动更差的元素:

Element theNewKid; // the new element we put in

Iterator<Element> qIt = q.iterator();
while(qIt.hasNext()) {
  Element next = qIt.next();
  if ( next.x == theNewKid.x && next.y == theNewKid.y && next.moves.compare(theNewKid.moves) > 0)
      qIt.remove()
}

q.add(theNewKid);
元素newkid;//我们加入的新元素
迭代器qIt=q.Iterator();
while(qIt.hasNext()){
元素next=qIt.next();
如果(next.x==theNewKid.x&&next.y==theNewKid.y&&next.moves.compare(theNewKid.moves)>0)
qIt.remove()
}
q、 添加(newkid);

< /代码>

只是考虑另一种选择。

您可以使用
ArrayList
,它通过
get()
方法提供随机访问

通过使用
add()
方法推到列表的末尾,并使用
remove(0)
从头部获取并移除元素,可以模拟
队列

当然,在以下几种情况下,这可能并不理想:

  • 实际上,您需要实例化一个
    队列
    ,因为其他一些代码需要它。正如Lutz Horn所建议的那样,
    LinkedList
    实现了
    Queue
    ArrayList
    没有

  • 性能:
    remove(0)
    的时间复杂度为O(n),因为每次调用
    remove()
    时都需要将底层数组向左移位

  • 另一方面,当使用随机访问时,您会得到一个优势,因为这是O(1)


    总而言之,你必须戴上你的工程师帽,决定你想要接受哪一套折衷方案。因为只有你知道如何使用它,所以只有你才能回答这个问题。

    如果你需要随机访问,不要使用队列。@FedericoklezCulloca我还可以使用什么实现FIFO但也有随机访问?请问一个关于随机访问FIFO结构的新问题。在答案不再匹配之前,不要编辑现有问题。@epithoritis32使用
    ArrayList
    。这使您可以使用
    get()
    进行随机访问。您可以“模拟”FIFO,方法是使用
    add()
    将其添加到队列的末尾,并使用
    remove(0)
    从头部弹出,这就是FIFO的操作方式。@Epitheoritis32关于我之前的评论,请注意,从队列中删除第一个元素时会损失一些性能,因为它是O(n)操作。
    LinkedList
    不适合随机访问。改用
    ArrayList
    。@FedericoklezCulloca对此毫无疑问。但是OP似乎同时需要
    列表
    队列
    行为
    ArrayList
    不实现
    Queue
    。它不实现,但可以模拟。由于您不能同时拥有这两个方面,如果出于语法原因您不需要实现
    Queue
    (也就是说,您实际上需要
    Queue
    )的一个实例,
    ArrayList
    为您提供了两个方面的最佳选择(请参见我对问题本身的评论)。同意。但是由于我们不知道OP想要什么,我们不应该猜测什么是更好的方法。您的评论促使我做了一些思考,事实上,使用ArrayList也有其缺点(弹出时的性能)。所以,是的,我们不应该猜测最好的方法,因为只有OP可以评估每种方法的权衡。
    Element theNewKid; // the new element we put in
    
    Iterator<Element> qIt = q.iterator();
    while(qIt.hasNext()) {
      Element next = qIt.next();
      if ( next.x == theNewKid.x && next.y == theNewKid.y && next.moves.compare(theNewKid.moves) > 0)
          qIt.remove()
    }
    
    q.add(theNewKid);