这道题是面百度时的一个问题,也是一道很经典的题目

给定一个整数集合{1,2,2,3,4},删除其中能够被2整除的元素(即最后集合变为{1,3})

看到这个问题,我开始觉得很简单

for (int i = 0; i<list.size(); i++) {if(list.get(i)%2==0){list.remove(i);}}

但是结果不是{1,3}而是{1,2,3},为什么会发生这么奇怪的结果呢?一切都要从这个remove方法说起

public E remove(int index) {Objects.checkIndex(index, size);final Object[] es = elementData;@SuppressWarnings("unchecked") E oldValue = (E) es[index];fastRemove(es, index);return oldValue;}
private void fastRemove(Object[] es, int i) {modCount++;final int newSize;if ((newSize = size - 1) > i)System.arraycopy(es, i + 1, es, i, newSize - i);es[size = newSize] = null;}
/*** Copies an array from the specified source array, beginning at the* specified position, to the specified position of the destination array.* @HotSpotIntrinsicCandidatepublic static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);

当我们遍历到下标为1的第二个元素2时,做了如下操作

> 下标                      0   1  2  3   4
> 原集合                    1   2  2  3   4
> 新集合                    1   2  3  4

也就是说集合在执行remove之后顺序已经发生了改变,当我们继续遍历下标为2的元素时,本来为2的元素现在被改变到下标为1的位置,这就造成了2这个元素被完美错过了!所以得出的结果是{1,2,3}而不是{1,3}

如果我们在IDE编写上述代码时,编译器会用黄色背景色提醒我们:

Suspicious ‘List.remove()’ in the loop less… (Ctrl+F1)
Inspection info: Reports when list.remove(index) is called inside the ascending counted loop. This is suspicious as list becomes shorter after that and the element next to removed will not be processed. Simple fix is to decrease the index variable after removal, but probably removing via iterator or using removeIf method (since Java 8) is a more robust alternative. If you don’t expect that remove will be called more than once in a loop, consider adding a break command after it.

编译器发出了一个良性的提示——小伙子你的循环删除元素有可能会遇到问题,你小心一点

说了会出现的问题和原因,最后我们说一下解决方案

逆序遍历元素

举个例子{2,3,2,4,5}


> 下标                      4   3  2    1     0
> 原集合                    2   3  2    4     5
> 新集合                         3  2    4    5
> 新集合                            3   4     5

遍历到某个元素发现需要删除,那么直接删除这个元素

1 如果这个元素是第一个元素,那么直接删除,其他元素顺序不用更改,不影响接下来的遍历
2 如果不是第一个元素,那么这个元素之前的元素需要改变位置,由于之前的元素已经判断过所以即使改变了位置也没问题,这个元素之后的元素不会改变位置,所以仍然不影响后续的遍历

逆序遍历解决问题

for (int i = list.size()-1; i >=0; i--) {if(list.get(i)%2==0){list.remove(i);}}

Java基础361问第4问——List如何遍历删除指定元素相关推荐

  1. Java集合如何遍历删除指定元素

    目录 1.删除List 2.删除Set 3.删除Map 注意事项: 1.删除List public class ListDemo {public static void main(String[] a ...

  2. Java 集合List、Set、HashMap操作二(Map遍历、List反向、Set删除指定元素,集合只读、TreeMap操作、List转Array、List移动元素)

    Map遍历 import java.util.Map; import java.util.HashMap; import java.util.HashSet; import java.util.Ite ...

  3. java list移除符合条件的元素_java List删除指定元素的三种方法

    java List删除指定元素有3种方法,分别是普通for循环,增强for循环以及原生的Iterator迭代器循环来删除list中指定的某个元素,非常的简单. 1:普通for循环遍历list,并删除指 ...

  4. Java基础(以及面试常问问题)

    1.Vector,ArrayList, LinkedList的区别(面试常问到的) 三者都是实现集合框架中的List,也就是所谓有序集合,因此具体功能比较近似,比如都提供按照位置进行定位.添加或删除的 ...

  5. Java基础篇面试题49问与答 (2021最新版)

    本文包含了String.包装类型.反射.泛型.序列化.异常和IO的常见面试题. 本文收录于<面试小抄>系列,Github地址:https://github.com/cosen1024/Ja ...

  6. 面试题|Java基础面试题连环55问(2022版)

    1. Java语言有哪些特点? 2. Java和C++有什么关系,它们有什么区别? 3. JVM.JRE和JDK的关系是什么? 4. 什么是字节码?采用字节码的好处是什么? 5. Oracle JDK ...

  7. java中map删除指定元素_Map中根据条件删除元素

    今天在写程序过程中,需要根据判断条件删除一个Map中的相应数据,我自然而然想到可以通过调用Map中的remove(Object key)函数进行删除:代码如下: public Map processM ...

  8. Java代码实现本地创建文件,读取文件,删除指定目录下的文件

    目录 一.需求: 二.实现: 1.完成创建文件,写入文件 2.读取文件 3.删除文件 测试: 注意: java的split方法分割字符串(分隔符如* | . ^ )及注意点 一.需求: 1.创建文件夹 ...

  9. java中线性表删除元素和删除指定元素_线性表的插入和删除(Java版)

    1.线性表的定义: (1).线性表是一种可以在任意位置插入和删除数据元素操作.由n(n≥0)个相同类型数据元素a0, a1,-, an-1组成的线性结构.除了第一个元素没有前驱元素和最后一个元素没有后 ...

最新文章

  1. Nhibernate 基础关系映射
  2. linux location root访问文件夹404_如何使网站支持https访问?nginx配置https证书
  3. angular的$http发送post,get请求无法传送参数的问题
  4. 我与计算机作文450字,打电脑作文450字
  5. 深入理解javascript原型链
  6. 一笔没有问题的数据 误操作成汇总和结算不一致的情况的处理方式
  7. Git和Github之间的区别
  8. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'userinfo.
  9. 网络地址转换协议NAT详解
  10. wps 模拟分析 规划求解_综合能源系统:规划及运行优化智慧决策平台介绍
  11. vgcreate 创建卷组
  12. Matlab图像的二维傅里叶变换频谱图特点研究
  13. python去掉左边的空格_Python去除字符串左边空格
  14. QGIS 导入图层到 PostGIS “导入某些图层失败! 图层“public“.‘xxxx‘载入失败 “
  15. 关于ViewPager.PageTransformer的一些理解
  16. 计算机组装与维护集体备课,浅谈集体备课
  17. 图片显示方向不对怎么办
  18. BI神器Power Query(5)-- PQ从工作簿导入数据(1/2)
  19. 电话号码组成分析 东海陈光剑
  20. 外媒称中国现行社保制度劫贫济富

热门文章

  1. html4.01文档类型有哪些,HTML 4.01XHTML 1.0标签大全.doc
  2. 河南高考录取统计分析
  3. 玉雕工作室php,时晓印传承海派玉雕工艺印象记 - 大师风采 - 千秋宝玉雕工作室...
  4. asp.net中的runat=server 属性
  5. java图形界面外部类例题_[JAVA_开课吧资源]第四周 图形用户界面程序设计
  6. MIPI转eDP IT6151
  7. 第三代半导体将写入“十四五规划”,这些公司有涉及
  8. Loopback接口的作用
  9. AddView和layoutParams总结
  10. CSDN如何进行转载