在ArrayList中搜索特定对象

我有一个名为Person的课程。 它具有以下attributes ; 它有2个属性, IDTelephone 。 1个人可以有很多电话,因此您可能会看到下面有多个ID的人。

 public ArrayList all(){ p = new ArrayList(); p.add(new Person(1,266763)); p.add(new Person(1, 358643)); p.add(new Person(2, 4667763)); return p; } 

还有另一个名为PersonDB的类。 它将有一个名为findPersonWithTheTelephoneNumber(int telephone)

 public void findPersonWithTheTelephoneNumber(int telephone) { Person pp = new Person(); ArrayList personList = pp.all(); // Now i want to find the Person object that will match the telephone number of these list of personList. } 

personList,有3-4个Person对象。 我需要搜索PersonArrayList并找到与Person对象匹配的对象。 我怎么能这样做?

注意:我试过personList.contains() 。 但这不起作用。

我试过personList.contains()

确保为Person类重写Object.equals()Object.hashCode() 。 但是你必须对电话号码进行平等检查,假设电话号码是唯一的。 这不是解决方案,而是解决方法。 使用bellum的答案。 将其标记为正确答案。

 //... Person foundPerson = null; for (Person p : personList){ if (p.getTelephone() == telephone){ foundPerson = p; //or simply return it from there break; } } 

要实现hashCodeequals您可以观察本教程 。

首先,为什么没有List来存储特定人的所有telephoneNumbers 。 这样,您就不必为同一personId每个telephoneNumber创建一个单独的Person实例,这根本没有意义。

您可以将Person类的属性更改为: –

 private int id; private List telephoneNumbers = new ArrayList(); 

然后有一个Person列表,就像你一样。

要查找具有特定telephoneNumber的Person ,您需要遍历List

 for (Person person: personList) { if (person.getTelephoneNumbers().contains(telephone)) { return person; } } 

您需要迭代数组,逐个检查人员的电话号码,当您到达那个时,您需要将其分配给变量。

使用for循环遍历列表。 在循环体中,检查列表中人员的电话号码是否是您要查找的电话号码。 如果是,则返回此人。

请参阅Oracle Java教程中的for语句 。

许多解决方案通过电话号码将两个人定义为相同但如果将两个住在同一房子和/或具有相同电话号码的人添加到列表中会怎样? 哪一个是正确的?

在急于寻找这个人之前,你必须确定一种方法来确定两个人是否确实相等而没有模棱两可的结果。 除非您通过使其独特来限制基于该电话号码的人员的创建(您不在问题中澄清这一点,所以我假设没有这样的限制),搜索的结果是不确定的。

您正在使用ArrayList因此您无法保证插入顺序的结果。

我建议你将相等测试基于一个人的ID而不是手机。 为了防止修改id ,只需为它定义一个getter,并且根本不定义setId方法。 然后,您可以基于id重新定义equals (如果您愿意,还可以重新定义hashcode )。