如何使用java
方法从java.util.List<Object>
获取特定的equals
对象
例如:
Class Person{
String name;
int age;
//...
@Override
public boolean equals(String str) {
return (this.name.equals(str.name));
}
}
main{
List<Person> list = personDao.findAll();
if(list.contain("joe")){
// how to get the Person named joe ????
}
}
答案 0 :(得分:3)
如果您想获得对列表中特定人员的引用:
Person foo = null;
for (Person p : list) {
if (p.getName().equals("joe")) {
foo = p;
break;
}
}
// now foo is your person (if he exists) or null (if he doesnt exist);
这只会找到名为joe的第一个人。
答案 1 :(得分:2)
Person.equals()方法的签名不正确...参数类型应始终为“Object”,如下所示:
@Override
public boolean equals(Object obj) {
return (obj instanceof Person) && ((Person) obj).name.equals(this.name);
}
然后jlordoless建议使用list.contains(new Person(“name”)将起作用。
答案 2 :(得分:2)
简单地迭代。 List
接口上没有从列表中返回对象的方法。
Person joe = null;
List<Person> persons = personDao.findAll();
for (Person thisPerson : persons) {
if ("joe".equals(thisPerson.getName())) {
joe = thisPerson;
break;
}
}
这会将Person joe
设置为名为joe的第一个人员。如果您要在集合中查找 last ,请删除break
语句。
答案 3 :(得分:1)
我认为你在这里有设计缺陷。如果有2个joe-s会发生什么?
如果您没有重复的名称,可以在Person
中为名称创建一个getter:
public String getName() {
return name;
}
之后你可以这样做:
Person joe = null;
for(Person person : list) {
if("joe".equals(person.getName()) {
joe = person;
break;
}
}
这样可以避免创建Person
。
答案 4 :(得分:1)
你不应该使用那样的平等。覆盖equals
有点复杂,例如,你也必须改编hashcode
。基于列表的解决方案,只需极少的更改:
Class Person{
String name;
int age;
//...
public String getName() {
return name;
}
}
main {
List<Person> list = personDao.findAll();
Person foundPerson = null;
for(Person person : list) {
if (person.getName().equals("joe")) {
foundPerson = person;
break;
}
}
if (foundPerson != null) {
// do something
}
}
但是,我会考虑使用Map<String, Person>
,其名称为关键。在忽略年龄的情况下覆盖equals
in person听起来不是很好,真的。
答案 5 :(得分:0)
@Hyde:你的答案无法回答。当且仅当使用散列时,才需要覆盖“hashCode”。如果人们想要使用HashMap或Hashing相关的其他API,那么他必须覆盖hashCode并且等于...否则“equals”工作正常。