在 ArrayList 中搜索特定对象
Posted
技术标签:
【中文标题】在 ArrayList 中搜索特定对象【英文标题】:Search an ArrayList for a particular Object 【发布时间】:2012-11-23 10:40:42 【问题描述】:我有一个名为Person
的课程。它有以下attributes
;它有 2 个属性,ID
和 Telephone
。一个人可以有多个电话,所以你可能会在下面看到有多个 ID 的人。
public ArrayList<Person> all()
p = new ArrayList<Person>();
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<Person> 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()
。但这不起作用。
【问题讨论】:
【参考方案1】:我试过 personList.contains()
确保为 Person 类覆盖 Object.equals()
和 Object.hashCode()
。但是假设电话号码是唯一的,您必须对电话号码进行平等检查。这不是一个解决方案,而是一种解决方法。使用bellum的答案。标记为正确答案。
【讨论】:
我不喜欢这种解决方案,因为这意味着如果两个Person
s 具有相同的电话号码(无论他们的 ID),它们就相等。
在 OP 的示例中,我认为 person.id
不可用,因此无法进行相等性测试。除非电话号码对人们来说是唯一的,并且用于检查相等性的唯一个人属性是电话号码。
你能告诉我一个如何实现这一点的例子吗?我有点新
是的,但是如果您实现hashCode
和equals
如您所提到的,您只能检查电话号码,然后contains(phonNumber)
将起作用。我在等你的例子,也许我弄错了。
@sharonHwk : 我给你举个例子,你能发布你的 Person 类吗?【参考方案2】:
首先,你为什么没有一个List<Integer>
来存储你所有的telephoneNumbers
给一个特定的人。这样一来,您就不必为同一个 personId
的每个 telephoneNumber
创建单独的 Person
实例,这根本没有意义。
您可以将 Person 类的属性更改为:-
private int id;
private List<Integer> telephoneNumbers = new ArrayList<Integer>();
然后有一个人的列表,就像你拥有的那样。
要查找具有特定电话号码的Person
,您需要遍历您的List<Person>
。
for (Person person: personList)
if (person.getTelephoneNumbers().contains(telephone))
return person;
【讨论】:
【参考方案3】:许多解决方案通过电话号码将两个人定义为相等,但是如果将住在同一所房子和/或具有相同电话号码的两个人添加到列表中怎么办?哪一个是正确的?。
在急于寻找此人之前,您必须定义一种方法来确定两个人是否确实相等,而不会产生模棱两可的结果。除非您通过使其唯一来限制基于该电话号码的人员的创建(您没有在您的问题中澄清这一点,所以我假设没有这样的限制),搜索的结果是未定义的。
您使用的是ArrayList
,因此您甚至无法保证插入订单的结果。
我建议您基于某人的ID
而不是电话号码进行平等测试。为了防止修改id
,只需为其定义一个getter,根本不定义setId
方法。然后,您可以基于id
重新定义equals
(如果您愿意,还可以重新定义hashcode
)。
【讨论】:
【参考方案4】://...
Person foundPerson = null;
for (Person p : personList)
if (p.getTelephone() == telephone)
foundPerson = p; //or simply return it from there
break;
要实现hashCode
和equals
,您可以观察this tutorial。
【讨论】:
这是正确的答案,但如果您关心性能,您可能需要考虑构建一个哈希映射电话号码给人们。否则它将每次都遍历列表。如果您进行迭代,我还建议在找到一个人后立即跳出循环。 这 2 个中最有效的是什么?它是迭代还是使用 hasCode/equals ? @sharonHwk 从长远来看,实现hashCode/equals
并使用get/contains
之类的方法比每次都遍历列表更有效。
@sharonHwk 最快的是Map<PhoneNumber, Person>
。在这里实现 hashCode 和 equals 是一个糟糕的 hack,因为这意味着如果两个 Person
s 的电话号码相等,则它们是相等的。那时不考虑他们的 ID。有效,但设计不佳。【参考方案5】:
使用for
循环遍历列表。在循环正文中,检查列表中人员的电话号码是否是您要查找的电话号码。如果是,则返回此人。
请参阅 Oracle 的 Java 教程中的 The for
Statement。
【讨论】:
【参考方案6】:您需要迭代数组,一一检查人员的电话号码,当您找到需要的人时,只需将其分配给一个变量。
【讨论】:
以上是关于在 ArrayList 中搜索特定对象的主要内容,如果未能解决你的问题,请参考以下文章