2012-11-06 38 views
1

如何使用equals方法 为例摆脱java.util.List<Object>特定java对象:使用equals方法获取列表<Object>中的对象?

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

'equals()'方法的签名是错误的。 – NPE

+1

更重要的是,这不是Object.equals的用处。 –

回答

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); 

这只能找到第一个人名为乔。

+0

实际上是'contains'。 –

+0

没有创建Person的新实例 –

+1

没有办法用'contains'做这个,没有创建'Person'的新实例,并且没有正确的Object.equals实现。 –

2

您Person.equals()方法是不正确...参数类型应该永远是“对象”,像这样的签名:

@Override 
public boolean equals(Object obj) { 
    return (obj instanceof Person) && ((Person) obj).name.equals(this.name); 
} 

然后jlordoless的使用list.contains(新人物的建议( “名”)会工作。

1

我认为你有一个设计缺陷在这里。会发生什么,如果有2乔-S?

如果没有重复的名字,你可以创建一个的吸气剂名字在Person

public String getName() { 
    return name; 
} 

之后,你可以这样做:

Person joe = null; 
for(Person person : list) { 
    if("joe".equals(person.getName()) { 
     joe = person; 
     break; 
    } 
} 

这样你避免造成不必要的Person实例。

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人。如果您要查找集合中的最后一个,请删除break声明。

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在个人中,而忽略年龄听起来不太好,真的。

0

@Hyde:无法回答您的答案。当且仅当使用散列时,覆盖“hashCode”是必需的。如果用户想要使用HashMap或哈希相关的其他API,而不仅仅是他必须重写hashCode并且等于...否则“equals”工作正常。

+0

我不同意。如果您为了能够使用某些容器而重写'equals',那么您很可能会意外地将它粘贴到使用'hashcode'的容器中。在Java中更改容器类型并不需要很多按键操作,而且您应该使用接口类型而不是实际的容器类名称,所以您甚至不应该关心它是哪个容器类!如果你想快速和肮脏,你总是可以制定一个自定义的方法。即使是玩具编码,也不要写坏的编码,因为坏习惯会持续下去,玩具编码也会变成非玩具编码。 – hyde

+0

我的观点是,重写hashCode和equals并不是强制性的,尽管遵循的是好的做法。 – Vishal

相关问题