在 ArrayList 中搜索特定对象

Posted

技术标签:

【中文标题】在 ArrayList 中搜索特定对象【英文标题】:Search an ArrayList for a particular Object 【发布时间】:2012-11-23 10:40:42 【问题描述】:

我有一个名为Person 的课程。它有以下attributes;它有 2 个属性,IDTelephone。一个人可以有多个电话,所以你可能会在下面看到有多个 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的答案。标记为正确答案。

【讨论】:

我不喜欢这种解决方案,因为这意味着如果两个 Persons 具有相同的电话号码(无论他们的 ID),它们就相等。 在 OP 的示例中,我认为 person.id 不可用,因此无法进行相等性测试。除非电话号码对人们来说是唯一的,并且用于检查相等性的唯一个人属性是电话号码。 你能告诉我一个如何实现这一点的例子吗?我有点新 是的,但是如果您实现hashCodeequals 如您所提到的,您只能检查电话号码,然后contains(phonNumber) 将起作用。我在等你的例子,也许我弄错了。 @sharonHwk : 我给你举个例子,你能发布你的 Person 类吗?【参考方案2】:

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

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

private int id;
private List<Integer> telephoneNumbers = new ArrayList<Integer>();

然后有一个人的列表,就像你拥有的那样。

要查找具有特定电话号码的Person,您需要遍历您的List&lt;Person&gt;

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;
    

要实现hashCodeequals,您可以观察this tutorial。

【讨论】:

这是正确的答案,但如果您关心性能,您可能需要考虑构建一个哈希映射电话号码给人们。否则它将每次都遍历列表。如果您进行迭代,我还建议在找到一个人后立即跳出循环。 这 2 个中最有效的是什么?它是迭代还是使用 hasCode/equals ? @sharonHwk 从长远来看,实现hashCode/equals 并使用get/contains 之类的方法比每次都遍历列表更有效。 @sharonHwk 最快的是Map&lt;PhoneNumber, Person&gt;。在这里实现 hashCode 和 equals 是一个糟糕的 hack,因为这意味着如果两个 Persons 的电话号码相等,则它们是相等的。那时不考虑他们的 ID。有效,但设计不佳。【参考方案5】:

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

请参阅 Oracle 的 Java 教程中的 The for Statement。

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于在 ArrayList 中搜索特定对象的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中的对象数组中搜索特定属性

使用and条件在mongodb文档的嵌套对象中搜索特定字符串

在表格视图控制器iOS swift中搜索特定记录

在 BlockingCollection 中搜索特定元素

在堆栈中搜索特定元素

spring-data-elasticsearch 在多个索引中搜索特定字段