有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码
List<Integer> list = new ArrayList<Integer>(); list.add(0); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); //正常循环 for (int i = 0; i < list.size(); i++) { System.out.println("i的值:" + i + " 对应的数字:" + list.get(i)); } System.out.println("没有remove前list的项:"+list.size()); //边循环边删除 for (int i = 0; i < list.size(); i++) { System.out.println("i的值:" + i + " 对应的数字:" + list.get(i)); if(list.get(i) == 3) list.remove(list.get(i));//删除list的第四项 } System.out.println("remove后list的项:"+list.size()); System.out.println("==========remove后的list=========="); for (int i = 0; i < list.size(); i++) { System.out.println("i的值:" + i + " 对应的数字:" + list.get(i)); }
执行代码, 结果如下:
i的值:0 对应的数字:0 i的值:1 对应的数字:1 i的值:2 对应的数字:2 i的值:3 对应的数字:3 i的值:4 对应的数字:4 i的值:5 对应的数字:5 i的值:6 对应的数字:6 i的值:7 对应的数字:7 没有remove前list的项:8 i的值:0 对应的数字:0 i的值:1 对应的数字:1 i的值:2 对应的数字:2 i的值:3 对应的数字:3 i的值:4 对应的数字:5 i的值:5 对应的数字:6 i的值:6 对应的数字:7 remove后list的项:7 ==========remove后的list========== i的值:0 对应的数字:0 i的值:1 对应的数字:1 i的值:2 对应的数字:2 i的值:3 对应的数字:4 i的值:4 对应的数字:5 i的值:5 对应的数字:6 i的值:6 对应的数字:7
可以看到没有删除前, 我们的list的项和循环对应的数字都是正确的, 但是下面的循环在删除第4个元素后,第4,5,6个项对应的数字本应该是4,5,6, 但是这里却变成了5,6,7.
原因是,我们删除第4项后,list的长度就变成7,而且,list会把第4项后面的值往前移一位, 也就是说,i=3时,list.get(i)=4,i=4时,list.get(i)=5,i=5时,list.get(i)=6,i=6时,list.get(i)=7.. 我们再说的形象一点, 就是本来有8层糕点,依次是0-7,竖起来,大的在上,小的在下,我们从下往上数,数到第5个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层
所以, 值为4的项我们根本没有循环到
那有什么方法可以实现remove呢, 有个笨方法,是新建一个tempList, 把要删除的项全部add进去,最后用list.removeAll(tempList)实现 . 但是这里我们有更好的方法, 就是倒序删除
还是上面的例子, 我们看代码:
List<Integer> list = new ArrayList<Integer>(); list.add(0); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.add(7); //正常循环 for (int i = 0; i < list.size(); i++) { System.out.println("i的值:" + i + " 对应的数字:" + list.get(i)); } System.out.println("没有remove前list的项:"+list.size()); //边循环边删除 for (int i = list.size() -1 ; i >= 0; i--) { System.out.println("i的值 " + i + " 对应的数字 " + list.get(i)); if(list.get(i) == 3) list.remove(list.get(i)); } System.out.println("remove后list的项:"+list.size()); System.out.println("==========remove后的list=========="); for (int i = 0; i < list.size(); i++) { System.out.println("i的值 " + i + " 对应的数字 " + list.get(i)); }
执行代码,结果如下:
i的值:0 对应的数字:0 i的值:1 对应的数字:1 i的值:2 对应的数字:2 i的值:3 对应的数字:3 i的值:4 对应的数字:4 i的值:5 对应的数字:5 i的值:6 对应的数字:6 i的值:7 对应的数字:7 没有remove前list的项:8 i的值 7 对应的数字 7 i的值 6 对应的数字 6 i的值 5 对应的数字 5 i的值 4 对应的数字 4 i的值 3 对应的数字 3 i的值 2 对应的数字 2 i的值 1 对应的数字 1 i的值 0 对应的数字 0 remove后list的项:7 ==========remove后的list========== i的值 0 对应的数字 0 i的值 1 对应的数字 1 i的值 2 对应的数字 2 i的值 3 对应的数字 4 i的值 4 对应的数字 5 i的值 5 对应的数字 6 i的值 6 对应的数字 7
我们可以看到变循环变删除,并不影响后面的元素, remove后的list也和第一次的结果是一样的 . 这是因为我们删除list元素,list的长度是会变小, 但是变化的只是比当前被删除元素的项大的项, 而我们这里使用倒序循环, 大的项, 我们已经执行过了, 所以不会影响.. 再用上面的比喻来说明,这次我们是从上往下数,数到第4个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层 , 但是这不影响我们之前数过的蛋糕, 而且对下面的蛋糕也不影响, 这就是原理
总结
以上就是本文关于ArrayList在for循环中使用remove方法移除元素方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:Java实现跳跃表(skiplist)的简单实例 Java多线程ForkJoinPool实例详解 等。感谢朋友们对小牛知识库网站的支持。有什么问题或者想要了解的可以随时给我们留言,小编会及时回复大家的。
本文向大家介绍java集合类arraylist循环中删除特定元素的方法,包括了java集合类arraylist循环中删除特定元素的方法的使用技巧和注意事项,需要的朋友参考一下 在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素。 一种错误的方式: 上面这种方式会抛出如下异常: 因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。 可以对上面的
本文向大家介绍jquery使用remove()方法删除指定class子元素,包括了jquery使用remove()方法删除指定class子元素的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery使用remove()方法删除指定class子元素的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的jQuery程序设计有所帮助。
我有这个代码: outlets是传递给方法的ArrayList;riverBasin是int(int[]riverBasin)的2D“矩阵”; 从ArrayList outlets中删除“项”会生成错误: 但我并不完全理解。然而,我怀疑我弄坏了迭代器。对的那么我如何删除ArrayList中不需要的元素呢。 提前感谢您的帮助, 里卡多
问题内容: 在Java中,对巨大的矩阵X使用以下函数来打印其列不相同的元素: 首先,我按列(索引j)进行迭代,并按行(索引i)进行内部迭代。 对于不同的矩阵,此函数将被调用数百万次,因此应优化代码以满足性能要求。我想知道关于values数组。使用还是代替它会更快? 问题答案: 效率更高的方法是使用Set而不是列表,例如HashSet实现。contains方法将在O(1)中运行,而不是在带有列表的O
从数组中移除给定函数返回 false 的元素。 使用 Array.filter() 和 Array.reduce() 来查找返回真值的数组元素,使用 Array.splice() 来移除元素。 func 有三个参数(value, index, array)。 const remove = (arr, func) => Array.isArray(arr) ? arr.filter(fu
我是C#的新手,我正在尝试制作一个程序来提示用户输入关于8个vocalist.genre输入的信息,然后根据vocalist.genre输入的内容将这些信息分类到文本文件中。但是,当我尝试使用for循环来处理用户的输入时,我遇到了一个问题。我该怎么办? }