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)