如何使用循环从Java中删除队列中的元素
我有这样的数据结构:
我正在尝试这样做: 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 和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中获取元素.提供和放置类似. 更多信息: > Java BlockingQueue take() vs poll() 另一种不那么错误的方法是使用临时集合,不一定是并发的,并将您仍需要的元素存储在队列中.这是一个启动示例: 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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |