需求:
有一个ArrayList数组,要求删除长度大于5的字符串,如:arr = {"ab1","123ad","bca","dadfadf","dddaaa","你好啊","我来啦","别跑啊"};
输出结果:
{"ab1","123ad","bca","你好啊","我来啦","别跑啊"}
问题:如何能够在下一次遍历时,弥补删除元素之后自动跳到下一个元素的漏洞。问题代码与图解如下:
for (int j = 0; j < arr.size(); j++) {
String str = (String) arr.get(j);
if (str.length() > 5) {
arr.remove(str);
}
}
报错:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
解决方案
方案1:倒序操作:
for (int j = arr.size(); j > 0; j--) {
String str = (String) arr.get(j);
if (str.length() > 5) {
arr.remove(str);
}
}
方案2:使用迭代器,利用迭代器的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);
}
}
方案3:使用迭代器,利用迭代器Iterator的子类listIterator的remove方法删除元素
ListIterator it = (ListIterator) arr.listIterator();
while (it.hasNext()) {
String str = (String) it.next();
if (str.length() > 5) {
it.remove();
}
}