遍历移除ArrayList<ArrayList<Place>>元素失败,代码调试求助
解决ArrayList移除子列表时操作未生效的问题
这个问题我太熟悉了——你遇到的是ArrayList正向遍历删除元素时的经典索引错位问题!
问题根源
你用for(int i = 0; i < routes.size(); i++)正向遍历的时候,当执行routes.remove(i),被删除元素后面的所有元素都会往前移动一位填补空缺。但循环的i会继续自增,这就导致你跳过了原本在i+1位置、现在移到i位置的元素,所以有些坏路线没被正确移除,看起来像是操作“未生效”。
三种可行的解决方案
1. 反向遍历删除
从列表末尾往前遍历,这样删除元素不会影响前面未遍历的元素索引:
public static void removeBadRoutes(ArrayList<ArrayList<Place>> routes, Expedition e) { // 从最后一个元素开始往前遍历 for(int i = routes.size() - 1; i >= 0; i--) { if(!isGoodRoute(routes.get(i), e)) { routes.remove(i); } } }
2. 使用迭代器(Iterator)安全删除
ArrayList的迭代器专门设计了安全的remove()方法,避免索引错位问题:
public static void removeBadRoutes(ArrayList<ArrayList<Place>> routes, Expedition e) { Iterator<ArrayList<Place>> iterator = routes.iterator(); while(iterator.hasNext()) { ArrayList<Place> route = iterator.next(); if(!isGoodRoute(route, e)) { // 用迭代器的remove方法,而非列表的remove iterator.remove(); } } }
3. Java 8+ 用removeIf简化代码
如果你的项目用Java 8或更高版本,removeIf方法是最简洁的选择——它底层就是用迭代器实现的:
public static void removeBadRoutes(ArrayList<ArrayList<Place>> routes, Expedition e) { routes.removeIf(route -> !isGoodRoute(route, e)); }
验证建议
你可以在删除前后打印routes.size(),或者在循环里加日志输出,确认坏路线是否被正确移除。
内容的提问来源于stack exchange,提问作者Jytrex
相关产品推荐
相关产品推荐

