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

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

我有 ArrayListObjects。我想看看 ArrayList 是否包含具有特定字段的 Object

TeamBuilder.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
    }

}

TeamMember.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());
    }

}

Team.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 和 return true 的列表,当它找到一个等于 [=16= 】 通过了。两个 Objects 是相等的,但是 .contains() 方法是 returning false。

如何优雅地检查 Team 是否包含具有指定 ID 的 TeamMember?由于 Java method: Finding object in array list given a known attribute value,我的印象是我可以避免 for 循环,但我无法让它工作。

最优雅的解决方案是

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