2016-02-27 2 views
0
switch(menuChoice) { 

case 1: 
    System.out.println("Enter your contact's first name:\n"); 
    String fname = scnr.next(); 
    System.out.println("Enter your contact's last name:\n"); 
    String lname = scnr.next(); 
    Necronomicon.addContact(new Person(fname, lname)); 
    break; 

// main truncated here for readability 

import java.util.ArrayList; 

public class AddressBook { 

    ArrayList<Person> ArrayOfContacts= new ArrayList<Person>(); 

    public void addContact(Person p) { 
     ArrayOfContacts.add(p); 

/* 
    for(int i = 0; i < ArrayOfContacts.size(); i++) { 
     if(ArrayOfContacts.get(i).getID() != p.getID()) 
      ArrayOfContacts.add(p); 

    else 
     System.out.println("Sorry this contact already exists."); 
    }  
    */ 

    } 
} 

public class Person { 

    private String fName = null; 
    private String lName = null; 
    private static int ID = 1000; 

    public Person(String fName, String lName) {  // Constructor I'm using to try and increment the ID each time a Person object is created starting at 1001. 

    this.fName = fName; 
    this.lName = lName; 
    ID = ID + 1; 
    } 
} 

Я пытаюсь создать адресную книгу при этом каждый контакт имеет имя, фамилию и уникальный идентификатор.Java адресная книга. Как предотвратить дублирование контактов в моем коде?

Мой вопрос заключается в том, как запретить пользователю вводить двойные контакты с тем же именем и фамилией? Должен ли я выполнять какую-либо проверку в методе addContact или прямо в главном? Как?

+0

Разве вы не запрещаете добавлять один и тот же идентификатор? Обычные адресные книги имеют двойные имена –

+0

Хорошая точка.Вероятно, это лучший способ сделать это. Возможно, я мог бы использовать HashSet и просто использовать идентификаторы пользователя, чтобы предотвратить дублирование. –

+0

Вы можете использовать 'HashMap ' –

ответ

0

Вот код для хранения дубликатов идентификаторов.

public void addContact(Person p) { 

    for(int i = 0; i < ArrayOfContacts.size(); i++) { 
     Person contact = ArrayOfContacts.get(i); 
     if(contact.getID() == p.getID()) { 
      System.out.println("Sorry this contact already exists."); 
      return; // the id exists, so we exit the method. 
     } 
    } 

    // Otherwise... you've checked all the elements, and have not found a duplicate 
    ArrayOfContacts.add(p); 

} 

Если вы хотели бы изменить этот код, чтобы сохранить дубликаты имен, а затем сделать что-то вроде этого

public void addContact(Person p) { 
    String pName = p.getFname() + p.getLname(); 
    for(int i = 0; i < ArrayOfContacts.size(); i++) { 
     Person contact = ArrayOfContacts.get(i); 
     String contactName = contact.getFname() + contact.getLname(); 
     if(contactName.equals(pName)) { 
      System.out.println("Sorry this contact already exists."); 
      return; // the name exists, so we exit the method. 
     } 
    } 

    // Otherwise... you've checked all the elements, and have not found a duplicate 
    ArrayOfContacts.add(p); 

} 
+0

Приятно поблагодарить вас. Я немного поиграю с этим кодом. Проверьте мое редактирование, будет ли я работать, если бы мог как правильно увеличивать каждый пользовательский идентификатор? Я должен назначить уникальный идентификатор каждому объекту пользователя, начинающемуся с 1000. Я решил, что просто увеличиваю каждый раз каждый раз, когда создаю объект нового человека. Проблема в том, что я не увеличиваю правильно. –

+0

Eac h У человека будет тот же идентификатор, поскольку вы используете переменную 'static'. Это «переменная класса», а не переменная «экземпляр». Если вам нужен инкрементирующий идентификатор, вам понадобится 'private int id; 'и установите его в вашем конструкторе в' this.id = ++ ID'. –

+0

Пробовал это, но это просто дает каждому человеку тот же ID. Может быть, так, как я тестирую, чтобы узнать, какой идентификатор, который каждый объект получает, ошибочен. Тьфу. –

0

Используйте HashSet. Для каждого имени пользователя добавьте его в HashSet.

Например:

HashSet<String> namesUsed = new HashSet<String>(); 

if (namesUsed.contains(userName)) { 
    //do what you want here, if this is entered it means there is a duplicate 
} else { 
    namesUsed.add(userName); //add it to the list of used names 
} 
+0

Я не думаю, что должно быть if-else, поскольку добавление одного и того же имени «не имеет эффекта» –

+0

@ cricket_007 Возможно, он хочет отобразить сообщение для пользователя, информирующее о том, что контакт уже существует. Но я бы сделал разные (для запретить вызов 2 метода - содержит и добавлять), поскольку метод add возвращает логическое значение, я бы сделал: If (! nameUsed.add (userName) {затем отобразить msg.}, поэтому ELSE не требуется. – developer033

+0

Да, это то, что я Я заметил выше, что адресным книгам разрешено иметь повторяющиеся имена, хотя –

0

Вы могли бы просто использовать HashSet и избежать каких-либо петель, чтобы проверить его. HashSet отвечает за эту функцию.

import java.util.Set; 
import java.util.HashSet; 

public class AddressBook { 

    Set<Person> listOfContacts = new HashSet<>(); 

    public void addContact(Person p) { 
     if (!listOfContacts.add(p)) 
     System.out.println("Sorry this contact already exists.");  
    } 
}    

Для увеличения ID собственности вы должны иметь 2 свойство, 1 статические и другие, и увеличивать его в конструкторе. Смотри:

public class Person { 
    private final int ID; 
    private static int id = 1000; 
    private String fName; 
    private String lName; 

    public Person(String fName, String lName) {  // Constructor I'm using to try and increment the ID each time a Person object is created starting at 1001. 
     this.ID= ++id; 
     this.fName = fName; 
     this.lName = lName; 
    } 

Чтобы сделать HashSet не принимать дублированные объекты, которые вы должны установить, какие свойства не должны быть продублированы в классе (Person в вашем случае). Следует пример:

@Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 61 * hash + Objects.hashCode(this.fName); 
     hash = 61 * hash + Objects.hashCode(this.lName); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null || getClass() != obj.getClass()) 
     return false; 

     final Person other = (Person) obj; 
     if (!Objects.equals(this.fName, other.fName)) 
     return false; 

     return Objects.equals(this.lName, other.lName); 
    } 
} 

Кстати, вы можете создать equals и hashCode методы с помощью IDE (Eclipse, NetBeans и т.д.)

EDIT

Поскольку вы не можете для использования HashSet я покажу версию с ArrayList. Кстати, вы должны использовать HashCode и equals, как я сказал, чтобы он работал хорошо

import java.util.List; 
import java.util.ArrayList; 

public class AddressBook { 

    List<Person> arrayOfContacts = new ArrayList<>(); 

    public void addContact(Person p) { 
     if (listOfContacts.contains(p)) 
     System.out.println("Sorry this contact already exists."); 

     else 
     arrayOfContacts.add(p);  
    } 
} 
+0

Спасибо разработчику. Я получил его, по крайней мере, правильно! Я пытался избежать использования хэш-набора, так как мы еще не рассмотрели его в нашем классе. Кажется, что это намного проще. –

+0

@NickM вы могли бы сказать это в своем посте, во всяком случае, я обновил свой ответ. Взглянуть. Отметьте как ответ, если это ответит на ваш вопрос. – developer033

0

Вы должны Override равно внутри класса Person

public boolean equals(Object obj) { 
    if(fName.equals(obj.getfName()) && lName.equals(obj.getlName)) { 
     return true; 
    } 
    return false; 
} 

Тогда просто позвоните:

if(!(person1.equals(person2))) { 
//not a duplicate 
} 

И, конечно, замените переменные/объекты любыми объектами, которые вы хотите. Вы также должны добавить геттеры и сеттеры для последнего и имени. Надеюсь, это поможет!

Смежные вопросы