使用equals方法?</object>获取List <object>中的Object

时间:2012-11-06 17:13:24

标签: java

如何使用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 ????
   }
}

6 个答案:

答案 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”工作正常。