需求:
有一个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(); } }