2016-02-27 59 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; 
    } 
} 

我想創建一個地址簿,其中每個聯繫人有姓,名和一個唯一的ID。Java地址簿。如何防止我的代碼中重複的聯繫人?

我的問題是如何防止用戶輸入具有相同名字和姓氏的重複聯繫人?我應該在addContact方法中執行某種檢查嗎?還是在main中執行?怎麼樣?

+0

難道你不應該阻止添加相同的ID嗎?普通地址簿有重複的名字 –

+0

好點。這可能是更好的方法。也許我可以使用HashSet並只使用用戶ID來防止重複。 –

+0

你可以使用'HashMap ' –

回答

0

這裏是保持掉重複的ID碼。

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

很好,謝謝。我將使用這些代碼。檢查我的編輯,如果我可以指出我的工作方式如何正確地增加每個用戶ID?我必須爲從1000開始的每個人物對象分配一個唯一的ID。我想我每次創建一個新的人物對象時都會增加一個。問題是,我沒有遞增正確。 –

+0

Eac h使用「static」變量後,Person將具有相同的ID。這是一個「類變量」,而不是「實例」變量。如果你想要一個遞增的ID,你需要一個'private int id;'並且在你的構造函數中將它設置爲'this.id = ++ ID'。 –

+0

試過,但它只是給每個人相同的ID。也許我測試的方式來查看每個對象所獲得的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){then display 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的不接受,你應該設置重複的對象的屬性不應該在類(在你的情況下,人)被複制。如下的例子:

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

順便說一句,您可以使用IDE(Eclipse中,NetBeans中,等)

編輯

既然你不能夠產生equalshashCode方法要使用HashSet,我將使用ArrayList顯示一個版本。順便說一句,你必須使用HashCodeequals正如我所說,使其正常工作

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

您應該重寫等於您的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 
} 

當然用任何你想要的對象替換變量/對象。 您還應該爲最後名字和名字添加getters和setter。 希望這有助於!

相關問題