2016-04-08 23 views
0

Temel bir cep telefonu uygulaması oluşturmaya çalışıyorum. Telefondaki mevcut kişileri sorgulamak için bir özellik uygulamaya çalışıyorum (ama başarısız). Kişileri içeren bir ArrayList nesnesini döndüren bir yöntem oluşturarak bunu yaptım. Bu, belirli bir iletişimin var olup olmadığını görmek için'a ekleyerek (for döngüsünü kullanarak) arama yapması gerekir. Daha sonra, yöntem, sorgunun sonuçlarından başka hiçbir şey içermeyen bir ArrayList nesnesini döndürmelidir. Ancak, kodumu test ederken, sorguyla eşleşip eşleşmediğine bakılmaksızın EVERY kişisinin ArrayList'a eklendiğini görüyorum. İşte benim kod bazı parçacıkları şunlardır: HaklıArrayList'e benzersiz nesneler ekleme

public static void main(String[] args) { 
     char c= 'A'; 

     for (int i = 0; i < 10; i++) { 
      //Create contacts with unique data 
      phone.addContact(Contact.createContact("Contact"+c++, "07"+i)); 
     } 

     System.out.println(phone.queryContacts("VoidContact")); //Dubious entry 
     System.out.println(phone.queryContacts("ContactB")); //This entry exists 
    } 

kodumu (Main.java) Test

Phone.java

private ArrayList<Contact> contacts; 

public Phone() { 
    this.contacts = new ArrayList<>(); 
} 

public ArrayList<Contact> queryContacts(String contactName) { 
     ArrayList<Contact> contactsList = new ArrayList<>(); 

     for (Contact contact : this.contacts) { 
      if (this.findContact(contactName)) 
       contactsList.add(contact); 
     } 
     return contactsList; 
    } 

    private boolean findContact(String contactName) { 
      for (Contact contact : this.contacts) { 
       if (contact.getName().equals(contactName)) 
        return true; 
      } 
      return false; 
} 

, ben başlatılmasıyla hiçbir çıktı alırsınız "VoidContact" parametresiyle phone.queryContacts() yöntemi. Ancak, meşru parametre "ilgili kişi", onu çağırma yerine sadece tek bir kişiyi aldıktan sonra, ben (benim Contact sınıfta Object.toString() overrided olduğunu lütfen unutmayın) şu çıktıyı almak:

Name: 'ContactA' Number: 070 
Name: 'ContactB' Number: 071 
Name: 'ContactC' Number: 072 
Name: 'ContactD' Number: 073 
Name: 'ContactE' Number: 074 
Name: 'ContactF' Number: 075 
Name: 'ContactG' Number: 076 
Name: 'ContactH' Number: 077 
Name: 'ContactI' Number: 078 
Name: 'ContactJ' Number: 079 

Benim soru; Girilen parametrelere dayanarak, her kişiyi, tekil temasların karşısına neden çıktı? Rehberiniz için şimdiden çok teşekkürler.

+2

yılında equals yöntemini geçersiz kılmalıdır? Görünüşe göre, ne kaydettiyseniz, 'contactList.add (contact)', 'contactList 'ifadesi hiçbir zaman tanımlanmadı.Böylece bu başarılı bir şekilde derlememelidir –

+0

@ VicSeedoubleyew Dunno bunu nasıl özledim. Eksik kodu ekledim. Teşekkürler –

+0

Aramıza hoş geldiniz :) –

cevap

2

Her şeyden önce kodunuz derlenmez: contactList değişkeni hiçbir yerde tanımlanmamıştır.

İkinci olarak, mantık kusurludur:

for (Contact contact : this.contacts) { 
     if (this.findContact(contactName)) 
      contactsList.add(contact); 
    } 
    return contactsList; 

en İngilizce tercüme edelim: Liste contactName içeriyorsa her kişi için, kişi listesine eklenir. Dolayısıyla, liste kişi adı içeriyorsa, tüm kişiler listeye eklenir, aksi halde hiçbiri eklenmez. Java 8 ile

public List<Contact> queryContacts(String contactName) { 
    List<Contact> contactsList = new ArrayList<>(); 
    for (Contact contact : this.contacts) { 
     if (contact.equals(contactName)) { 
      contactsList.add(contact); 
     } 
    } 
    return contactsList; 
} 

Veya:

public List<Contact> queryContacts(String contactName) { 
    return contacts.stream() 
        .filter(contact -> contact.getName().equals(contactName)) 
        .collect(Collectors.toList()); 
} 
+0

Yorum için teşekkürler. Ancak, şimdi yanlış olduğunu bilmeme rağmen, hala orijinal mantıktaki kusurları anlayamıyorum? –

+0

Kişilerin Alice, Bob, Carl ve Dominic içerdiğini düşünün. Carl adındaki tüm kişileri arıyorsun. Döngününüzü Alice'le iletişime geçirin. Ve sen de bir irtibat bul (Carl). Carl listede bulunduğu için doğrudur. Böylece mevcut kişiyi, Alice'i listeye eklersiniz. Sonra döngü Bob ile devam ediyor. Carl temaslarda var. Evet, şimdi mevcut kişiyi Bob'a listeye ekleyelim. Vb vb –

+0

Ahh, büyük bir açıklama. Çok teşekkürler, bu gerçekten temizlemenize yardımcı oldu –

1

iyi sulution olduğunu

Ne gerçekten istediğiniz verilen ada sahip listesinde kişileri bulan bir yöntemdir ArrayL'ı kullanmak isterseniz, Hashet

'u kullanın. ist: Her iki çözümlerinde

for (Contact contact : this.contacts) { 
    if(!collection.contains(contact){ 
     collection.add(concat); 
    } 
} 

Eğer tam olarak çalışıyoruz kodu ilan mı Contact.class

public boolean equals(Object o){ 
    if(o == null) return false; 
    if(o insteadof Contact){ 
     Contact c=(Contact)o; 
     return c.name.equals(this.name); 
    } 
    return false; 
}