gpt4 book ai didi

java - 如何使用循环从 Java 中的队列中删除元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:39 33 4
gpt4 key购买 nike

我有这样的数据结构:

BlockingQueue mailbox = new LinkedBlockingQueue();

我正在尝试这样做:

for(Mail mail: mailbox)
{
if(badNews(mail))
{
mailbox.remove(mail);
}
}

显然循环的内容会干扰边界并触发错误,所以我通常会这样做:

for(int i = 0;  i < mailbox.size(); i++)
{
if(badNews(mailbox.get(i)))
{
mailbox.remove(i);
i--;
}
}

但遗憾的是 BlockingQueue 没有通过索引获取或删除元素的功能,所以我被卡住了。有什么想法吗?

编辑 - 一些说明:我的目标之一是保持相同的顺序,因此从头部弹出并放回尾部是不好的。此外,虽然没有其他线程会从邮箱中删除邮件,但它们会添加邮件,所以我不想在删除算法的中间,有人给我发邮件,然后发生异常。

提前致谢!

最佳答案

你可以 p̶o̶p̶ poll和 p̶u̶s̶h̶ offer队列中的所有元素,直到您对队列进行完整循环。这是一个例子:

Mail firstMail = mailbox.peek();
Mail currentMail = mailbox.pop();
while (true) {
//a base condition to stop the loop
Mail tempMail = mailbox.peek();
if (tempMail == null || tempMail.equals(firstMail)) {
mailbox.offer(currentMail);
break;
}
//if there's nothing wrong with the current mail, then re add to mailbox
if (!badNews(currentMail)) {
mailbox.offer(currentMail);
}
currentMail = mailbox.poll();
}

请注意,只有当此代码在单个线程中执行并且没有其他线程从该队列中删除项目时,此方法才有效。

也许您需要检查是否真的要轮询或从 BlockingQueue 中取出元素。报价和认沽类似。

更多信息:


另一种错误较少的方法是使用临时集合,不一定是并发的,并将您仍然需要的元素存储在队列中。这是一个启动示例:

List<Mail> mailListTemp = new ArrayList<>();
while (mailbox.peek() != null) {
Mail mail = mailbox.take();
if (!badNews(mail)) {
mailListTemp.add(mail);
}
}
for (Mail mail : mailListTemp) {
mailbox.offer(mail);
}

关于java - 如何使用循环从 Java 中的队列中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26479052/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com