Java或者Python List调用remove()删除数据,出现的坑

    public static void main(String[] args) throws Exception {
        List<String> ll = new ArrayList<>();
        ll.add("张三");
        ll.add("李四");
        ll.add("张无忌");
        ll.add("李文");
        ll.add("李丽");
        ll.add("吴勇");

        for (int i = 0; i < ll.size(); i++) {
            if(ll.get(i).startsWith("李")){
                ll.remove(i);
            }
        }
        System.out.println(ll.toString());

    }
rList = ["张三","李四","张无忌","杨文","李丽","吴勇"]
for item in rList:
    if item.startswith("李"):
        rList.remove(item)
print(rList)

这两个代码的意思都是,循环List判断如果是“李”开头,则删除list里面这条数据。这个看起来没有问题,实际问题很大;

原因是:当列表中的某个元素被移除后,列表的大小减小,但是循环的索引i仍然会增加。这意味着,在移除一个元素后,下一个元素(在原始列表中的位置)将不会被检查,因为i已经增加到了下一个索引。

因此会存在跳过很多数据,如果list中两个相邻的数据都是以“李”开头,则会出现漏删除的问题;

python也是如此;

java解决办法

1、使用迭代器

Iterator<String> it = ll.iterator();  
while (it.hasNext()) {  
    String s = it.next();  
    if (s.startsWith("李")) {  
        it.remove();  
    }  
}

2、使用stream流

List<String> filteredList = ll.stream()  
                               .filter(s -> !s.startsWith("李"))  
                               .collect(Collectors.toList());  
ll = filteredList; // 如果需要更新原列表

3、每次删除,则索引往前退一位

for (int i = 0; i < ll.size(); i++) {  
    if (ll.get(i).startsWith("李")) {  
        ll.remove(i);  
        i--; // 由于删除了元素,索引需要回退一位  
    }  
}

 python的解决办法

rList = ["张三","李四","张无忌","杨文","李丽","吴勇"]
for  index in  range(len(rList)-1,-1,-1):
    if rList[index].startswith("李"):
        rList.remove(rList[index])
print(rList)

可以进行倒着循环,从后往前循环删除,如果碰到符合删除的数据,删除了,索引还是倒着走,数据也是倒着走,不会影响到漏数据删除;

"""
 rang()方法 
    如果rang(3):表示从0开始生成到2,因为右边不包含。 
    如果rang(1,3):表示生成1,2。
    如果range(1,6,2):表示1,3,5。后面的2表示2个数差多少
    
    如果要倒这生成
        range(3,-1)这样写是不对的,因为倒着生成必须要设置差
        正确的是这样的range(3,-1,-1):表示3,2,1,0
        range(3,-1,-2):表示3,1
"""
for index  in range(3,-1,-1):
    print(index)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值