繁体   English   中英

如何检查 ArrayList 是否包含具有特定字段值的对象?

[英]How can I check if an ArrayList contains an Object with a specific field value?

我有一个ObjectsArrayList 我想看看该ArrayList包含具有特定字段的Object

团队建设者.java

public class TeamBuilder {

    public static void main(String[] args) {
        Team team = new Team();
        team.addMember(new TeamMember("myID"));
        System.out.println(team.containsMember("myID"));  //false
    }

}

团队成员.java

public class TeamMember {

    private String id;

    public TeamMember(String id) {
        this.id = id;
    }

    public String getID() {
        return this.id;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof TeamMember) {
            o = ((TeamMember) o).getID();
        }
        return o.equals(this.getID());
    }

}

团队.java

import java.util.ArrayList;

public class Team {

    private ArrayList<TeamMember> members = new ArrayList<>();

    public boolean addMember(TeamMember teamMember) {
        if (members.contains(teamMember)) {
            return false;
        }
        members.add(teamMember);
        return true;
    }

    public boolean containsMember(String eid) {
        System.out.println(members.get(0).equals(eid));  //true
        System.out.println(members.contains(eid));  //false
        if (members.contains(eid)) {
            return true;
        }
        return false;
    }

}

我不想使用循环,也不想覆盖arrayList.contains()

我期待.contains()遍历我的TeamMember列表,并在找到与传递的Object相等的列表时返回true 这两个Objects是相等的,但.contains()方法返回 false。

如何优雅地检查Team包含具有指定 ID 的TeamMember 我的印象是我可以避免 for 循环,因为Java 方法:在数组列表中查找对象给定已知属性值,但我无法让它工作。

最优雅的解决方案是

  1. 首先,最重要的是修复您的 equals 方法,以便它履行 equals 合同 --- 意思是如果a.equals(b)那么b.equals(a)必须为真。
  2. 您永远不应该让 TeamMember 对象等于 String。 这将导致难以调试的副作用和错误的可能性,这是您真正不想要的。
  3. equals 方法不应该抛出异常。 他应该首先检查引用是否相等,然后是类是否相同,然后是字段是否相等。
  4. 您的 TeamMember 类也应该覆盖hashCode()并且它应该使用与 equals 方法相同的字段。
  5. 然后设置一个HashMap<String, TeamMember>匹配 ID 字符串 TeamMember 对象。
  6. 确保您的 ID 是不可变的。
  7. 使用 String-TeamMember 对填充您的地图
  8. 当您需要与 ID 匹配的 TeamMember 时调用get(String key)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM