2016-04-08 17 views
0

Ich versuche, eine grundlegende Handy-Anwendung zu erstellen. Ich versuche (aber scheiterte), eine Funktion zu implementieren, um vorhandene Kontakte auf dem Telefon abzufragen. Ich habe dies getan, indem ich eine Methode erstellt habe, die ein ArrayList Objekt zurückgibt, das Kontakte enthält. Dies soll funktionieren, indem Sie suchen (mit einer for Schleife), um zu sehen, ob ein bestimmter Kontakt existiert, und es zu der ArrayList hinzufügen, falls dies der Fall ist. Danach sollte die Methode ein ArrayList-Objekt zurückgeben, das nur die Ergebnisse der Abfrage enthält. Wenn ich jedoch meinen Code teste, stelle ich fest, dass JEDER Kontakt zur ArrayList hinzugefügt wird, unabhängig davon, ob er mit der Abfrage übereinstimmt oder nicht. Hier sind einige Auszüge aus meinen Code:Hinzufügen von eindeutigen Objekten zu ArrayList

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; 
} 

meinen Code testen (Main.java)

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 
    } 

Rechtmäßig so erhalte ich keine Ausgabe auf Berufung die phone.queryContacts() Methode mit dem "VoidContact" Parameter. Doch bei ihm mit dem legitimen Parameter „Kontakt B“, anstatt nur empfangen nur einen Ansprechpartner aufrufen, erhalte ich die folgende Ausgabe (bitte beachten Sie, dass ich Object.toString() in meiner Contact Klasse overrided haben):

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 

Meine Frage; Warum wird jeder Kontakt im Gegensatz zu den eindeutigen Kontakten basierend auf den eingegebenen Parametern ausgegeben? Vielen Dank im Voraus für Ihre Antwort.

+2

außer Kraft setzen Haben Sie auf dem Laufenden genau den Code, den Sie versuchen? Es scheint nicht, denn in dem, was Sie gepostet haben, wurde 'contactsList' nie definiert, wenn 'contactsList.add (contact)' ausgeführt wird.Also das sollte nicht erfolgreich kompilieren –

+0

@VicSeedoubleyew Weiß nicht, wie ich das verpasst habe. Ich habe den fehlenden Code hinzugefügt. Danke –

+0

Sie sind herzlich willkommen :) –

Antwort

2

Zunächst wird Ihr Code nicht kompiliert: Die Variable contactsList ist nirgendwo definiert.

Zweitens Ihre Logik ist fehlerhaft:

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

ist dies auf Englisch Lassen Sie übersetzen: für jeden Kontakt, wenn die Liste contactName enthält, wird der Kontakt in die Liste aufgenommen. Wenn also die Liste den Kontaktnamen enthält, werden alle Kontakte zur Liste hinzugefügt, andernfalls wird keine hinzugefügt.

Was Sie wirklich wollen, ist eine Methode, die die Kontakte in der Liste findet, die den angegebenen Namen haben:

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; 
} 

Oder mit Java 8:

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

Danke für den Kommentar. Aber obwohl ich jetzt weiß, dass es falsch war, verstehe ich immer noch nicht den Fehler in der ursprünglichen Logik? –

+0

Stellen Sie sich vor, die Kontakte enthalten Alice, Bob, Carl und Dominic. Du suchst alle Kontakte namens Carl. Sie starten Ihre Schleife mit dem Kontakt Alice. Und Sie rufen findContact (Carl). Es ist wahr, da Carl in der Liste existiert. Sie fügen also den aktuellen Kontakt Alice zur Liste hinzu. Dann geht die Schleife mit Bob weiter. Gibt es Carl in den Kontakten? Ja, also fügen wir den aktuellen Kontakt Bob zur Liste hinzu. Usw. –

+0

Ahh, großartige Erklärung. Vielen Dank, das hat wirklich geholfen, es aufzuklären –

1

Die beste sulution ist Verwenden Sie HashSet

Set<Contact> collection=new HashSet<Contact>(); 
//... 
for (Contact contact : this.contacts) { 
    collection.add(concat); 
} 

sowieso, wenn Sie ArrayL verwenden möchten ist:

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

in beiden Lösungen müssen Sie equals Methode in 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; 
} 
Verwandte Themen