我有点问题。我试图从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]等等......
有什么问题?
谢谢你,我很高兴收到你的回复!
答案 0 :(得分:1)
好的,您的代码存在两个问题:
请尝试按照链接中的说明解决您的问题
答案 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"));