ArrayList:在for循环期间删除一个对象

时间:2013-02-24 20:02:31

标签: java

我有点问题。我试图从ArrayList中删除一个对象,但是没有发生变化。

以下是代码示例:

    List<Room> rooms = new CopyOnWriteArrayList<Room>();

    rooms.addAll(fp.getRooms());
    int counter = 1;

    for(Room r: rooms){
        for(Square s: r.getDoor()){
            r.getDoor().remove(s);
            String name = String.valueOf(fp.getRooms().size() + counter);
            Room doorRoom = new Room(name, false, s, s);
            rooms.add(doorRoom);
            counter++;
        }
    }

    fp.setRooms(rooms);

我尝试删除对象s并将其替换为新对象doorRoom

输出:

First> [S: 11:7; true, S: 11:15; true, S: 11:20; true]
Second> [S: 11:7; true, S: 11:15; true, S: 11:20; true]

我期待:

First> [S: 11:7; true, S: 11:15; true, S: 11:20; true]
Second> [S: 11:15; true, S: 11:20; true]
等等......

有什么问题?

谢谢你,我很高兴收到你的回复!

3 个答案:

答案 0 :(得分:1)

好的,您的代码存在两个问题:

  1. 你实际上并没有删除“r”。您只能从门上移除与“r”相关联的方块。
  2. 您无法删除扩展for循环内的对象。你应该使用一个迭代器(参见:Calling remove in foreach loop in Java)并且我不能完全确定你是否可以在迭代它时将一个对象添加到一个集合中(参见Java: adding elements to a collection during iteration)。
  3. 请尝试按照链接中的说明解决您的问题

答案 1 :(得分:0)

for (Square s: r.getDoor())在内部使用迭代器,在迭代时不能更改ArrayList。如果你使用了一个循环变量(for (int i = 0;...)),它会工作,但这并不是一个好主意,因为列表的长度会改变,而且一些对象将不会被循环控制。

你应该记住要删除的对象,然后在循环后删除。

答案 2 :(得分:0)

实际上你可以在迭代时修改列表,但不能直接修改列表(它会抛出ConcurrentModificationException)。只需使用ListIterator即可。例如:

    List<String> l = new ArrayList<>();
    l.add("a");
    l.add("b");
    l.add("c");

    for (ListIterator<String> it = l.listIterator(); it.hasNext();) {
        String s = it.next();
        if ("b".equals(s)) {
            it.remove();
            it.add("r");
        }
    }

    assertFalse(l.contains("b"));
    assertTrue(l.contains("r"));