加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-05-25 00:21:01 所属栏目:Java 来源:互联网
导读:我有这样的数据结构: BlockingQueue mailbox = new LinkedBlockingQueue(); 我正在尝试这样做: for(Mail mail: mailbox){ if(badNews(mail)) { mailbox.remove(mail); }} 显然循环的内容会干扰边界并触发错误,所以我通常会这样做: for(int

我有这样的数据结构:

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没有按索引获取或删除元素的功能,所以我卡住了.有任何想法吗?

编辑 – 一些澄清:
我的目标之一是保持相同的顺序,从头部弹出并将其放回尾部是不好的.此外,虽然没有其他线程会从邮箱中删除邮件,但是它们会添加到邮箱中,因此我不希望处于删除算法的中间,让某人向我发送邮件,然后发生异常.

提前致谢!

解决方法

您可以在队列中完成所有元素,直到队列中的所有元素为止,然后才能使用 poll和push 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中获取元素.提供和放置类似.

更多信息:

> Java BlockingQueue take() vs poll()
> LinkedBlockingQueue put vs offer

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

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);
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读