-1

我有一个小问题。我正在尝试从 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

输出:

第一> [S: 11:7; 是的,S:11:15;是的,S:11:20;真的]
第二>[S:11:7;是的,S:11:15;是的,S:11:20;真的]

我期待:

第一> [S: 11:7; 是的,S:11:15;是的,S:11:20;真的]
第二>[S:11:15;是的,S:11:20;真的]

以此类推……

问题是什么?

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

4

3 回答 3

1

好的,您的代码有两个问题:

  1. 您实际上并没有删除“r”。您只需从与“r”关联的门中删除一个正方形。
  2. 您不能删除扩展 for 循环内的对象。您应该为此使用迭代器(请参阅:在 Java 中的 foreach 循环中调用 remove),我不完全确定是否可以在迭代时将对象添加到集合中(请参阅Java:在迭代期间向集合添加元素) .

尝试按照链接中的说明解决您的问题

于 2013-02-24T20:17:08.610 回答
0

实际上,您可以在迭代时修改 Lists,但不能直接修改(它会抛出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"));
于 2013-02-24T20:37:31.413 回答
0

for (Square s: r.getDoor())在内部使用迭代器,并且在迭代它时不能更改 ArrayList。如果使用循环变量for (int i = 0;...)

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

于 2013-02-24T20:18:32.213 回答