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

时间:2015-06-17 19:17:30

标签: java arraylist override equals contains

我有ArrayList Objects。我想看看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列表,并在找到等于true的{​​{1}}时返回Object。两个Objects相等,但.contains()方法返回false。

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

1 个答案:

答案 0 :(得分:1)

最优雅的解决方案是

  1. 首先修复你的equals方法,使其达到等于合同 - 意味着a.equals(b)然后b.equals(a) 必须为真。
  2. 您永远不应该让TeamMember对象等于String。这将导致难以调试的副作用和错误的可能性,你真的不想要。
  3. equals方法永远不应该抛出异常。他应首先检查参考相等性,然后检查类相同性,然后检查字段相等性。
  4. 您的TeamMember类也应该覆盖hashCode(),它应该使用与equals方法相同的字段。
  5. 然后设置一个匹配ID Strings TeamMember对象的HashMap<String, TeamMember>
  6. 确保您的ID是不可变的。
  7. 使用String-TeamMember对填充您的地图
  8. 当您需要与ID匹配的TeamMember时,请致电get(String key)