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

Java中存储自定义Model的ArrayList如何按tag属性获取对应元素索引

问题原因

ArrayList.indexOf()方法的匹配逻辑是将传入参数与集合内元素逐一调用equals()方法做相等判定,你的集合内存储的全是Model类型对象,传入的是String类型的"Action",类型不匹配,永远判定为不相等,所以固定返回-1。

解决方案

方案1:手动遍历集合查找(全Java版本兼容,灵活度最高)

普通for循环直接逐个匹配tag属性,找到第一个符合条件的元素索引即可:

int targetIndex = -1;
for (int i = 0; i < arr.size(); i++) {
    // 把常量写在equals前面避免空指针
    if ("Action".equals(arr.get(i).getTag())) {
        targetIndex = i;
        break; // 只找第一个匹配项就加break,需要找所有匹配项就去掉break,把索引存入集合即可
    }
}

方案2:Java 8+ 用流API实现(代码更简洁)

import java.util.stream.IntStream;

// ...其他代码
int targetIndex = IntStream.range(0, arr.size())
        .filter(i -> "Action".equals(arr.get(i).getTag()))
        .findFirst()
        .orElse(-1); // 未找到时返回-1,和原生indexOf的返回值逻辑对齐

可选方案:重写Model的equals方法(仅适合业务上要求按tag判定Model相等的场景)

如果你的业务逻辑中,确实规定tag属性相同的Model对象就判定为相等,可以重写Model类的equals()和hashCode()方法:

import java.util.Objects;

public class Model {
    String title, tag;

    // ...原有构造方法、getter、setter保持不变

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Model model = (Model) o;
        return Objects.equals(tag, model.tag);
    }

    @Override
    public int hashCode() {
        return Objects.hash(tag);
    }
}

重写后就可以直接调用indexOf方法,注意传入的是tag为Action的Model对象:

int index = arr.indexOf(new Model(null, "Action"));

注意:该方案会改变Model对象的全局相等判定逻辑,如果你其他场景需要同时对比title和tag来判定两个Model相等,不要用这个方案。

内容的提问来源于stack exchange,提问作者James Bond

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:06:00