我们都知道你不能这样做:
for (Object i : l) {
if (condition(i)) {
l.remove(i);
}
}
Run Code Online (Sandbox Code Playgroud)
ConcurrentModificationException等等......这显然有时起作用,但并非总是如此.这是一些特定的代码:
public static void main(String[] args) {
Collection<Integer> l = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
l.add(4);
l.add(5);
l.add(6);
}
for (int i : l) {
if (i == 5) {
l.remove(i);
}
}
System.out.println(l);
}
Run Code Online (Sandbox Code Playgroud)
当然,这会导致:
Exception in thread "main" java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)
...即使多线程没有这样做......无论如何.
什么是这个问题的最佳解决方案?如何在循环中从集合中删除项而不抛出此异常?
我也在Collection这里使用任意,不一定是ArrayList,所以你不能依赖get.
是否有可能在增强的for循环中找到当前索引?如果是这样的话?
我知道我们可以用一个额外的变量检查它.但还有其他方法.
public boolean cancelTicket(Flight f, Customer c) {
List<BookingDetails> l = c.getBooking();
if (l.size() < 0) {
return false;
} else {
for (BookingDetails bd : l) {
if(bd.getFlight()==f){
l.remove() // Index here..
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想从一个ArrayList完成它的时候删除一个对象,但我找不到办法去做.试着像下面的示例代码中删除它不想工作.我怎么能px在这个循环中找到当前对象的迭代器来删除它?
for( Pixel px : pixel){
[...]
if(px.y > gHeigh){
pixel.remove(pixel.indexOf(px)); // here is the thing
pixel.remove(px); //doesn't work either
}
}
Run Code Online (Sandbox Code Playgroud) 我正在浏览以下代码示例:
public class GenericTest {
public static void main (String[] args) {
ArrayList<String> myList = new ArrayList<String>();
String s1 = "one";
String s2 = "two";
String s3 = "three";
myList.add(s1); myList.add(s2); myList.add(s3);
String st;
Iterator<String> itr = myList.iterator();
while (itr.hasNext()) {
st = itr.next();
System.out.println(st);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道使用Iterator接口的实现而不是使用普通的for-each循环有什么好处?
for ( String str : myList ) {
System.out.println(str);
}
Run Code Online (Sandbox Code Playgroud)
如果这个例子不相关,那么当我们应该使用Iterator时会有什么好处呢?
谢谢.
我有一系列的java.awt.Rectangles.对于那些不熟悉这门课程的人来说,重要的信息是它们提供了一种.intersects(Rectangle b)功能.
我想编写一个函数来获取这个Rectangles 数组,并将其分解为连接的矩形组.
比方说,例如,这些是我的矩形(构造函数采用的参数x,y,width,height):
Rectangle[] rects = new Rectangle[]
{
new Rectangle(0, 0, 4, 2), //A
new Rectangle(1, 1, 2, 4), //B
new Rectangle(0, 4, 8, 2), //C
new Rectangle(6, 0, 2, 2) //D
}
Run Code Online (Sandbox Code Playgroud)
快速绘图显示A相交B和B相交C.D不相交.一个繁琐的ascii艺术作品也完成了这项工作:
????????? ?????
?A????? ? ? D ?
????????? ?????
? B ?
?????????????????
? ????? C ?
?????????????????
Run Code Online (Sandbox Code Playgroud)
因此,我的函数的输出应该是:
new Rectangle[][]{
new Rectangle[] {A,B,C},
new Rectangle[] {D}
} …Run Code Online (Sandbox Code Playgroud) 我是kotlin编程的新手.我想要的是我想在迭代它时从列表中删除特定数据,但是当我这样做时,我的应用程序崩溃了.
for ((pos, i) in listTotal!!.withIndex()) {
if (pos != 0 && pos != listTotal!!.size - 1) {
if (paymentsAndTagsModel.tagName == i.header) {
//listTotal!!.removeAt(pos)
listTotal!!.remove(i)
}
}
}
Run Code Online (Sandbox Code Playgroud)
要么
for ((pos,i) in listTotal!!.listIterator().withIndex()){
if (i.header == paymentsAndTagsModel.tagName){
listTotal!!.listIterator(pos).remove()
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的例外
java.lang.IllegalStateException
Run Code Online (Sandbox Code Playgroud) 我看到一种奇怪的行为.
List<String> li = new ArrayList<>();
li.add("a");
li.add("b");
li.add("c");
li.add("d");
li.add("e");
for(String str:li){
if(str.equalsIgnoreCase("d")){
li.remove(str); //removing second last in list works fine
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试删除列表中的第二个以外的任何其他,我得到ConcurrentModificationException.在阅读"Oracle认证助理Java SE 7程序员学习指南2012"时,我注意到它错误地假设.remove()始终使用删除列表中倒数第二个的示例.
我想知道为什么我不能从列表中删除元素,当我使用 foreach 循环迭代它时:
List<Object> objects = new ArrayList<Object>();
Object one = new Object();
Object two = new Object();
Object three = new Object();
objects.add(one);
objects.add(two);
objects.add(three);
Run Code Online (Sandbox Code Playgroud)
然后删除元素,如:
foreach(Object o : objects){
objects.remove(three); //I know that o is my current object
}
Run Code Online (Sandbox Code Playgroud)
似乎 foreach 循环不允许删除循环队列中“静止”的对象。我对么?
为什么 for-int-loop 不关心这个?在这个循环中,我可以轻松删除仍在循环中的对象。
谢谢
我正在尝试创建一个霍夫曼树,并且正在尝试合并两棵树.我无法弄清楚如何在没有得到"并发修改异常"的情况下删除程序中的树,因为我正在迭代列表并尝试同时从列表中删除.
BinaryTree<Character, Integer> t1 = null;
BinaryTree<Character, Integer> t2 = null;
BinaryTree<Character, Integer> tFinal = null;
int treeSize = TREES.size();
for (int i = 0; i < treeSize; i++) {
for (BinaryTree<Character, Integer> t : TREES) {
System.out.println("treeSize " + treeSize);
System.out.println(t.getRoot().getElement()
+ " t.getRoot().getElement()");
// here I edited the merge function in Binary Tree to set
// the new root
// to have null value for value, and itemTwo for weight
System.out.println(t.getRoot().getValue() + " weight of tree \n");
t1 …Run Code Online (Sandbox Code Playgroud) 我执行下面的代码,但有时我得到 java.util.ConcurrentModificationException 异常..但有时工作正常。请让我知道我在哪里做错了代码。下面是我的代码,如果有更好的方法,请检查我的逻辑,然后让我知道。
public String saveSkills(HttpServletRequest request,@RequestParam String skills,@RequestParam String Email) throws IOException
{
Domain domain1 = (Domain)request.getSession().getAttribute("Domain");
Long domanId =domain1.getDomainId();
System.out.println(skills);
String[] skillsParts = skills.split(",");
UserProfile user = userProfileManager.getUserByEmail(domain1.getPrimary_Domain_Id(), Email);
if(user.getSkillsList().size()>0){
Iterator it = user.getSkillsList().iterator();
while (it.hasNext())
{
Skills skillsitereator = (Skills) it.next();
int count=0;
for(int i =0;i<skillsParts.length;i++){
if((skillsParts)[i].equals(skillsitereator.getSkillName())){
break;
}else{
count++;
}
}
if(count == skillsParts.length){
it.remove();
userProfileManager.update(user);
}
}
}else{
for(int i =0;i<skillsParts.length;i++){
Skills skillObj = new Skills();
skillObj.setSkillName(skillsParts[i]);
user.getSkillsList().add(skillObj);
}
userProfileManager.update(user);
}
skillsParts = skills.split(",");
System.out.println(skillsParts); …Run Code Online (Sandbox Code Playgroud)