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