如何检查 ArrayList 是否包含具有特定字段值的对象?
How can I check if an ArrayList contains an Object with a specific field value?
我有 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
和 return true
的列表,当它找到一个等于 [=16= 】 通过了。两个 Objects
是相等的,但是 .contains()
方法是 returning false。
如何优雅地检查 Team
是否包含具有指定 ID 的 TeamMember
?由于 Java method: Finding object in array list given a known attribute value,我的印象是我可以避免 for 循环,但我无法让它工作。
最优雅的解决方案是
- 首先修复你的 equals 方法,使其满足 equals 契约——意思是如果
a.equals(b)
那么 b.equals(a)
必须 为真。
- 您永远不应该让 TeamMember 对象等于字符串。这将导致难以调试的副作用和错误的可能性,你真的不想要。
- equals 方法不应该抛出异常。他应该首先检查引用相等性,然后是 class 相同性,然后是字段相等性。
- 您的 TeamMember class 也应该覆盖
hashCode()
并且它应该使用与 equals 方法相同的字段。
- 然后设置一个
HashMap<String, TeamMember>
匹配 ID 字符串 TeamMember 对象。
- 确保您的 ID 是不可变的。
- 用 String-TeamMember 对填充您的地图
- 当您需要与 ID 匹配的团队成员时,请调用
get(String key)
。
我有 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
和 return true
的列表,当它找到一个等于 [=16= 】 通过了。两个 Objects
是相等的,但是 .contains()
方法是 returning false。
如何优雅地检查 Team
是否包含具有指定 ID 的 TeamMember
?由于 Java method: Finding object in array list given a known attribute value,我的印象是我可以避免 for 循环,但我无法让它工作。
最优雅的解决方案是
- 首先修复你的 equals 方法,使其满足 equals 契约——意思是如果
a.equals(b)
那么b.equals(a)
必须 为真。 - 您永远不应该让 TeamMember 对象等于字符串。这将导致难以调试的副作用和错误的可能性,你真的不想要。
- equals 方法不应该抛出异常。他应该首先检查引用相等性,然后是 class 相同性,然后是字段相等性。
- 您的 TeamMember class 也应该覆盖
hashCode()
并且它应该使用与 equals 方法相同的字段。 - 然后设置一个
HashMap<String, TeamMember>
匹配 ID 字符串 TeamMember 对象。 - 确保您的 ID 是不可变的。
- 用 String-TeamMember 对填充您的地图
- 当您需要与 ID 匹配的团队成员时,请调用
get(String key)
。