Java地址簿。如何防止代码中出现重复的联系人?

标签 java object arraylist

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。

我的问题是如何防止用户输入具有相同名字和姓氏的重复联系人?我应该在 addContact 方法中还是在 main 方法中实现某种检查?如何?

最佳答案

您可以简单地使用 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);
   }
}

顺便说一句,您可以使用 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);    
   }
}

关于Java地址簿。如何防止代码中出现重复的联系人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53490923/

相关文章:

java - 将纪元时间转换为日期字符串

java - org.h2.jdbc.JdbcSQL异常 : Table "ALL_SEQUENCES" not found

java - Spring Data Gemfire 存储 java.lang.Class 字段

javascript - 如何从对象中的 forEach 中获取搜索结果?

java - 将未知数量的对象添加到数组列表

java - 使用 ArrayList 访问特定对象 Java

java - 如何打印没有方括号的列表?

java - Multi-Tenancy 方法的 Apache Ignite 性能

javascript - 使用 'for..in' 和 'if' 迭代条件删除对象属性

arraylist - Javafx - 使用数组列表填充表格 View 而不添加新列