Java如何根据另一列表的Ticket编号删除目标列表中的对应条目
正确实现方案
核心思路
先将待删除列表中的ticket编号提取为HashSet(查询效率O(1)),再直接批量过滤原列表,避免嵌套循环、索引偏移等问题。
代码实现
// 1. 提取所有需要删除的ticket编号 Set<String> toDeleteNumbers = new HashSet<>(); for (Ticket ticket : finalList) { toDeleteNumbers.add(ticket.getNumber()); } // 2. 直接过滤原列表,删除匹配编号的条目 ticketList.removeIf(t -> toDeleteNumbers.contains(t.getNumber()));
之前方案失败的原因
- 第一种方案:增强for循环遍历ArrayList时直接调用
remove()方法会触发隐式的并发修改检查,要么报错要么不生效,且逻辑是列表内去重,不符合「按另一个列表删除」的需求。 - 第二种方案:
removeIf的lambda条件没有用到当前遍历元素lt,只要两个列表存在匹配的编号,条件就会恒成立,最终会清空整个列表。 - 第三种方案:正序按索引删除时,删除靠前元素会导致后续元素索引整体前移,存储的原始索引就会失效,最终触发索引越界异常。
低版本Java兼容方案(不支持removeIf时使用)
用迭代器遍历删除,不会有并发修改问题:
Set<String> toDeleteNumbers = new HashSet<>(); for (Ticket ticket : finalList) { toDeleteNumbers.add(ticket.getNumber()); } Iterator<Ticket> iterator = ticketList.iterator(); while (iterator.hasNext()) { Ticket current = iterator.next(); if (toDeleteNumbers.contains(current.getNumber())) { iterator.remove(); } }
内容的提问来源于stack exchange,提问作者flpbrandao
相关产品推荐
相关产品推荐

