You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:27:01