在做软件构造lab2时,忽然遇到的问题,老师上课其实将来,下面来汇总一下有关遍历list然后删除元素的方法,以lab2的set函数中删除边为例(这个函数是创建新编,但是如果两点间已存在边,则删除原有边再添新边)
目前姑且有三种方法:
1.
for(int i=0;i< edges.size;i++){
if(edges.get(i).getsource()==vertex && edges.get(i).gettarget()==vertex) {
edges.remove(i);
}
}
这里个代码其实会引发错误,因为edges.size会随着你的删减而编号,list中的元素编号也会发生变换,而这个代码并没有发现。稍微修改改一下如下:
for(int i=0;i< edges.size;i++){
if(edges.get(i).getsource()==vertex && edges.get(i).gettarget()==vertex) {
edges.remove(i);
break;
}
}
由于我们想要删除的有向边只有一个或者干脆没有,所有,可以在删除后直接break返回。
或者让size成为一个我们可控的值。:
int size=edges.size;
for(int i=0;i< size;i++){
if(edges.get(i).getsource()==vertex && edges.get(i).gettarget()==vertex) {
edges.remove(i);
size--;
i--;
}
}
2.
for(Edge i:edges) {
if(i.getsource()==source && i.gettarget()==target) {
edges.remove(i);
break;
}
}
这里如果不加break,问题和1方法中的问题一样,edges.size会随着你的删减而编号,list中的元素编号也会发生变换,而这个代码并没有发现,所以只能实现删除一个元素。
3.
Iterator<Edge> it = edges.iterator();
while(it.hasNext()){
Edge i = it.next();
if(i.getsource()==source && i.gettarget()==target){
it.remove();
}
}
这种方法能够实现删除多个元素,要注意这里的删除要用iterator的删除方法,不能用list中的删除方法,否则会报错ConcurrentModificationException,原因于之前相同。
这类错误具体的分析如下:
就是说我们在用subjects删除时,iter是不知道的,从而导致了错位,因此我们在调用iterator时就只能用iterator的方法进行删除。
参考网址:http://www.imooc.com/article/286726?block_id=tuijian_wz