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

如何在ArrayList中查找匹配输入的Item并删除?StackOverflow首次提问

解决ArrayList中查找并删除匹配Item对象的问题

嘿,恭喜你在StackOverflow提第一个问题!咱们先从你代码里的小问题说起,再一步步实现删除功能~

第一步:先修复你的equals方法

你提供的equals方法有两个关键问题:

  1. 你现在写的是重载而非重写Object类的equals方法,Java里要正确判断对象相等,必须重写public boolean equals(Object obj),而不是参数为Item的版本;
  2. 代码里的i.getType().equals(title)明显是笔误吧?你的Item类属性是genre,应该改成i.getGenre().equals(genre)才对!

给你一个标准的equals和hashCode实现(这俩要成对重写哦,保证逻辑一致性):

import java.util.Objects;

public class Item {
    private String title;
    private String author;
    private String genre;

    // 构造器、getter/setter方法这里省略,记得补充哦

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Item item = (Item) o;
        return Objects.equals(title, item.title) &&
               Objects.equals(author, item.author) &&
               Objects.equals(genre, item.genre);
    }

    @Override
    public int hashCode() {
        return Objects.hash(title, author, genre);
    }
}

第二步:实现查找并删除匹配对象的功能

下面给你三种常用的实现方式,根据你的Java版本和需求选择就行:

方式1:使用迭代器(兼容所有Java版本)

用Iterator遍历并删除是最安全的方式,不会出现ConcurrentModificationException异常:

// 假设你有一个ArrayList<Item> items,以及要匹配的目标Item targetItem
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
    Item currentItem = iterator.next();
    if (currentItem.equals(targetItem)) {
        iterator.remove(); // 直接删除当前匹配的元素
        // 如果只需要删除第一个匹配的元素,这里可以加break;终止循环
    }
}

方式2:Java 8+的removeIf方法(更简洁)

如果你的项目用Java 8及以上,用removeIf一行代码就能搞定,可读性拉满:

// 删除所有匹配的元素
items.removeIf(item -> item.equals(targetItem));

// 如果只删第一个匹配的元素,可以先找到再删除:
items.remove(items.stream().filter(item -> item.equals(targetItem)).findFirst().orElse(null));

方式3:先找到索引再删除(适合单个匹配场景)

如果确定列表里只有一个匹配元素,也可以先找到索引再删除:

int indexToRemove = -1;
for (int i = 0; i < items.size(); i++) {
    if (items.get(i).equals(targetItem)) {
        indexToRemove = i;
        break; // 找到第一个匹配项就停止遍历
    }
}
if (indexToRemove != -1) {
    items.remove(indexToRemove);
}

小提示

  • 如果你的“输入匹配”不是完全匹配整个Item对象,而是匹配某个属性(比如只匹配书名),那可以直接在判断时写属性匹配逻辑,比如item.getTitle().equals(inputTitle);
  • 不要用普通的for循环(从前往后)直接删除多个元素,会因为元素移位导致漏删或者索引越界问题。

内容的提问来源于stack exchange,提问作者Chase Allen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:07:29