软件构造遍历list删除元素方法总结

在做软件构造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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值