相关疑难解决方法(0)

迭代集合,在循环中删除对象时避免使用ConcurrentModificationException

我们都知道你不能这样做:

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.

java iteration collections

1158
推荐指数
12
解决办法
46万
查看次数

是否有可能在增强的for循环中找到当前索引?

是否有可能在增强的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)

java for-loop

35
推荐指数
3
解决办法
3万
查看次数

从每个循环中的ArrayList中删除对象

我想从一个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)

java arraylist

21
推荐指数
2
解决办法
4万
查看次数

在Java中使用迭代器有什么好处

我正在浏览以下代码示例:

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

15
推荐指数
2
解决办法
1万
查看次数

如何将一组矩形分组到连接区域的"岛屿"中?

问题

我有一系列的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)

java algorithm recursion geometry arraylist

13
推荐指数
1
解决办法
4632
查看次数

在迭代kotlin时从列表中删除数据

我是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)

android kotlin

11
推荐指数
5
解决办法
1万
查看次数

Java list的.remove方法仅适用于每个循环内部的倒数第二个对象

我看到一种奇怪的行为.

    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()始终使用删除列表中倒数第二个的示例.

java foreach

10
推荐指数
2
解决办法
3879
查看次数

Foreach 针对 for(int...) 循环 - 为什么在删除元素时 foreach 会引发异常?

我想知道为什么我不能从列表中删除元素,当我使用 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 不关心这个?在这个循环中,我可以轻松删除仍在循环中的对象。

谢谢

java foreach for-loop

5
推荐指数
1
解决办法
480
查看次数

如何在修改列表时从列表中删除

我正在尝试创建一个霍夫曼树,并且正在尝试合并两棵树.我无法弄清楚如何在没有得到"并发修改异常"的情况下删除程序中的树,因为我正在迭代列表并尝试同时从列表中删除.

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

4
推荐指数
1
解决办法
281
查看次数

有时会抛出 java.util.ConcurrentModificationException

我执行下面的代码,但有时我得到 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)

java concurrency spring exception

3
推荐指数
1
解决办法
3464
查看次数