ArrayList中remove()方法删除长度大于5的元素之后下标重定位的问题
来源:互联网 发布:ip网络广播软件 编辑:程序博客网 时间:2024/05/22 23:59
1、问题阐述
需求描述:
有一个ArrayList数组,要求删除长度大于5的字符串,如:arr = {"ab1","123ad","bca","dadfadf","dddaaa","你好啊","我来啦","别跑啊"};
要求结果输出:
{"ab1","123ad","bca","你好啊","我来啦","别跑啊"}
遇到的问题:
删除元素可以用remove()方法,我开始用的是for循环来操作,先循环遍历arr集合,如果发现该元素的长度大于5就删除该元素。此时出现如下几个问题:
问题1:假设此时删除的元素下标为3,后面的元素会自动往前移动一位,填补被删除了的元素,下一次循环遍历下标就变成了4,直接跳过了之前填补的位置,但刚刚的位置的元素已经变了,此时这个元素已经遍历不到了。
问题2:删除了元素但arr的长度此时还是原来的长度,没有更新,结果导致数组下标溢出。
思考之后发现使用for循环的弊端就是i++及arr.size()的问题。
中心难点是如何能够在再一次遍历刚刚位置上的元素,弥补删除元素之后自动跳到下一个元素的漏洞。问题代码与图解如下:
for (int j = 0; j < arr.size(); j++) { String str = (String) arr.get(i); if (str.length() > 5) { arr.remove(str); }}错误提示:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6at java.util.ArrayList.rangeCheck(Unknown Source)at java.util.ArrayList.get(Unknown Source)
2、解决方案
方案1:使用迭代器,利用迭代器的remove方法删除元素,优点是不用考虑数组的长度
Iterator it = arr.iterator();while (it.hasNext()) { String str = (String) it.next(); if (str.length() > 5) { // 判断字符串的长度是否大于5 it.remove(); // 使用迭代器的remove方法 } else { System.out.println(str); }}方案2:使用迭代器,利用迭代器Iterator的子类listIterator的remove方法删除元素ListIterator it = (ListIterator) arr.listIterator();while (it.hasNext()) { String str = (String) it.next(); if (str.length() > 5) { it.remove(); }}3、经验总结
① 如果遍历集合的时候,不需要对集合中的元素进行操作(增加、删除),推荐使用增强for循环
② 如果遍历集合的时候,需要对集合中的元素进行操作(增加、删除),那么只能使用迭代器
- 使用迭代器进行迭代器(Iterator)进行操作时,不允许使用集合的add、remove方法,但是可以使用迭代器的remove方法
- Iterator还有一个子接口(ListIterator),提供了add和remove方法,可以在遍历list集合的时候,对集合进行增加删除操作。
阅读全文
0 0
- ArrayList中remove()方法删除长度大于5的元素之后下标重定位的问题
- java中ArrayList使用remove删除元素时几种常见的问题及解决办法
- 查找ArrayList元素的下标
- java中ArrayList的remove方法删除一个数据时问题简述
- 删除数组中下标为n的元素(2)
- 关于用集合的remove方法删除list集合中满足条件的元素问题
- 多线程中ArrayList调用Add()添加元素时的下标越界问题(java.lang.ArrayIndexOutOfBoundsException)
- javaseday17补充(remove删除依赖的方法 ArrayList去重 TreeSet比较器)
- ArrayList删除元素(remove())报错的原理与解决办法
- 单链表元素定位(输出链表中元素的下标)
- ArrayList的remove()方法
- 使用Iterator的remove方法删除元素
- Java ArrayList删除特定元素的方法
- STL容器中元素的删除erase()、remove()
- 删除数组中下标为n的元素
- torch中如何找出矩阵中元素之大于某个阈值的所有元素的下标?torch.find() ?
- 【Android】ArrayList通过remove方法删除元素对象源码分析
- Iterator对象的remove方法是迭代过程中删除元素的唯一方法
- MYSQL MVCC 实现机制
- 在Java的JFrame中,Button按钮不能正常显示东西而显示...问题
- win7和VMware Linux 使用ssh问题总结
- C语言学习笔记(2)——指针(下)
- 【java基础】抽象类与接口的异同!
- ArrayList中remove()方法删除长度大于5的元素之后下标重定位的问题
- Kinect V2 在windows上开发遇到的问题
- 分页查询工具类
- HTML5 介绍
- 关于防sql注入
- linux命令之用户管理
- 19.6 union一种节省空间的类--使用类管理union成员
- tp取无限级分类
- 数据结构:用JS模拟Set类的实现