2016-07-29 47 views
0

我想在我的方法findContactsByName中使用for-each循環搜索ArrayList中包含的字符串,如果在聯繫人中找到字符串,則聯繫人被返回,如果沒有找到字符串,則返回null。然而,當測試我的代碼null一直返回,這裏是我的代碼:使用字符串作爲參數對ArrayList進行線性搜索

import java.util.*; 

public class Phonebook { 
    private String owner; 
    private ArrayList<Contact> contacts = new ArrayList<Contact>(); 

    public void addContact(Contact contact) { 
     contacts.add(contact); 
    } 

    public void show() { 
     System.out.println(owner + "'s phonebook"); 
     for (Contact contact : contacts) { 
      System.out.println(contact); 
     } 
    } 

    public Contact findContactByName(String name) { 
     for (Contact contact : contacts) { 
      if (contacts.contains(name)) { 
       return contact; 
      } 
     } 
     return null; 
    } 
} 
+5

嘗試遵循以下命名約定:一個名爲Contact的Contact接口很容易混淆。變量名稱應該是'contact'。 –

+0

考慮使用一個''HashMap''而不是迭代通過ArrayList自己 –

+0

在你的增強型for循環do(Contact contact:contacts)中代替,它更容易閱讀,同時也是一個適當的實現,不使用類的名稱作爲該變量的名稱.. – Javant

回答

3

您的findContactByName方法是不正確的。您是通過ArrayList的循環,但每個循環中,您通過使用ArrayList.contains,這是在列表本身的對象比較name檢查數組列表。

正確的方式做這將是:

public Contact findContactByName(String name) { 
    for (Contact contact : contacts) { 
     if (contact.getName().equals(name)) { 
      return contact; 
     } 
    } 
    return null; 
} 

即假設Contact對象有一個名爲getName方法。請注意,在每個循環我使用contact從for循環(Contact contact : contacts),而不是ArrayList的本身。

+0

這不是無效的。最好做Objects.equals(contact.getName()。name) –

1
public Contact findContactByName(String name) { 
    for (Contact Contact : contacts) { 
     if (contacts.contains(name)) { 
      return Contact; 
     } 
    } 
    return null; 
} 

此功能是問題的根本原因。您在if阻止條件如下:contacts.contains(name)其中contacts是聯繫人的完整列表,你是一個字符串對象找在那裏。這是行不通的。您想知道您的聯繫人是否包含具有特定姓名的聯繫人。所以像這樣:contact.getName().equals(name)

所以,你的函數應該是這樣的:

public Contact findContactByName(String name) { 
    for (Contact contact : contacts) { 
     if (contact.getName().equals(name)) { 
      return contact; 
     } 
    } 
    return null; 
} 
0

示例使用包含是

List<String> fruitsList = new ArrayList<>(); 
fruitsList.add("Apple"); 
fruitsList.add("Mango"); 
fruitsList.add("Grapes"); 

if(fruitsList.contains("Grapes")) { 
S.o.p("Found Grapes"); 
} 

但對於你的情況,你需要找到你的DTO特定的元素,然後返回如果特定的名稱被發現,所以你的用例是:

public Contact findContactByName(String name) { 
    for (Contact contact : contacts) { 
     if ((null!=contact.getName()) && contact.getName().equals(name)) { 
      return contact; 
     } 
    } 
    return null; 
} 

假設你Contact類具有名稱變量。 希望你理解它。

0

除非使用ArrayList特別要求,我建議你最好HashMap<String, Contact>取代它,這樣你就可以通過簡單地依靠Map.get(key)方法避免編碼從暫存的搜索算法。地圖旨在通過一些鍵(索引)來搜索值:

public class Phonebook { 

    private Map<String, Contact> contacts = new HashMap<String, Contact>(); 

    public void addContact(Contact Contact) { 
     contacts.put(contact.getName(), contact); 
    } 

    public Contact findContactByName(String name) { 
     return contacts.get(name); 
    } 
} 

此外,搜索然後變成索引並且因此,更快的。