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
相关产品推荐
相关产品推荐

