Java中如何遍历Person列表删除所有匹配指定firstName的元素?
问题根因
- 初始版本逻辑问题:遍历全程只记录最后一个匹配的Person对象,循环结束后仅执行一次删除,自然只能删一个。
- 增强for循环中直接调用
List.remove()的问题:增强for是迭代器的语法糖,遍历过程中直接修改集合结构(增删)会触发ConcurrentModificationException,即便未抛出异常,删除元素后列表索引会整体前移,会直接跳过下一个待遍历的元素,导致漏删匹配项。 - 最后写的嵌套循环存在逻辑错误,甚至可能触发死循环,完全不可用。
正确实现方案
以下三种是常用的安全实现方式:
方案1:使用迭代器自带的remove方法(兼容所有Java版本)
这是最稳妥的通用实现,迭代器的remove()方法会同步修改expectedModCount,不会触发并发修改异常,能正确遍历所有元素。
public void deleteFriend(String firstName){ Iterator<Person> iterator = friendsList.iterator(); while (iterator.hasNext()) { Person f = iterator.next(); if(f.getFirstName().equalsIgnoreCase(firstName)){ iterator.remove(); } } System.out.println("All matched friends deleted."); }
方案2:Java 8+ 直接使用removeIf方法(最简写法)
Java 8及以上版本的Collection接口提供了removeIf()默认方法,底层就是迭代器实现,一行代码就能完成需求:
public void deleteFriend(String firstName){ friendsList.removeIf(f -> f.getFirstName().equalsIgnoreCase(firstName)); System.out.println("All matched friends deleted."); }
方案3:倒序遍历普通for循环
倒序遍历的时候,删除元素只会影响已经遍历过的后半段索引,不会干扰未遍历的前半段,不会出现漏删的问题:
public void deleteFriend(String firstName){ for (int i = friendsList.size() - 1; i >= 0; i--) { if (friendsList.get(i).getFirstName().equalsIgnoreCase(firstName)) { friendsList.remove(i); } } System.out.println("All matched friends deleted."); }
内容的提问来源于stack exchange,提问作者cruella devil
相关产品推荐
相关产品推荐

