2012-12-05 68 views
2

我有一个叫做Person的类。它有以下attributes;它有2个属性,IDTelephone。 1人可以有很多电话,所以你可能会看到下面有多个ID的人。在ArrayList中搜索特定的对象

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

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

+0

我不喜欢这个解决方案,因为如果他们有相同的电话号码(不管他们的ID),这意味着两个'Person'是相等的。 – Kai

+0

在OP的例子中,我不认为'person.id'可用,所以没有办法进行平等测试。除非电话号码是人们唯一的,并且用于检查平等的唯一人员属性是电话号码。 –

+0

你能告诉我一个例子如何实现这个。我有点新 –

0

您需要迭代数组,检查电话号码中的人物,然后在需要时将其分配给变量。

0

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

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

3
​​

为了实现hashCodeequals可以观察this tutorial

+1

这是正确的答案,但如果您关心性能,您可能需要考虑构建一个哈希映射电话号码给人。否则,它将每次遍历列表。我也建议一旦找到一个人,就重新开始循环。 –

+0

2中最高效的是什么?它迭代或使用hasCode /等于? –

+0

@sharonHwk长期执行'hashCode/equals'并使用像get/contains这样的方法,每次遍历整个列表会更高效。 – bellum

2

首先,为什么你没有List<Integer>来存储你所有的telephoneNumbers为一个特定的人。这样,您将不必为每个telephoneNumber创建一个单独的Person实例,但是对于相同的personId,这样做毫无意义。

你可以改变你的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; 
    } 
} 
0

许多解决方案,定义了两个人,通过他们的电话号码相同,但住在同一所房子和/或具有相同的电话号码,如果有什么两个人被添加到列表中?哪一个是正确的?

在急于找到此人之前,您必须定义一种方法来确定两个人是否确实相等,且没有模棱两可的结果。除非你根据这个电话号码的独特性来限制个人的创作(你没有在你的问题中说明这一点,所以我假设没有这样的限制),搜索的结果是不确定的。

您正在使用ArrayList,所以即使通过插入顺序得到的结果也无法保证。

我建议你在一个人的ID而不是其电话的基础上进行平等测试。为了防止id的修改只为其定义一个吸气剂,并且根本不定义一个setId方法。然后,您可以基于id重新定义equals(和hashcode,如果您觉得喜欢)。