【问题标题】:Search an ArrayList for a particular Object在 ArrayList 中搜索特定对象
【发布时间】: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()。但这不起作用。

【问题讨论】:

    标签: java class object arraylist


    【解决方案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】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-02-28
            • 1970-01-01
            • 1970-01-01
            • 2020-12-14
            • 2017-09-08
            • 2012-10-30
            相关资源
            最近更新 更多