2012-12-05 66 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,如果您覺得喜歡)。