【问题标题】:Java address book. How to prevent duplicate contacts in my code?Java 通讯录。如何防止我的代码中出现重复的联系人?
【发布时间】:2016-02-27 21:58:51
【问题描述】:
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 中实现某种检查?如何?

【问题讨论】:

  • 不应该阻止添加相同的id吗?普通通讯录名称重复
  • 好点。这可能是一种更好的方法。也许我可以使用 HashSet 并只使用用户 ID 来防止重复。
  • 您可以使用HashMap&lt;Integer, Person&gt;
  • 我在学习 Cricket 时还没有遇到过 HashMaps。我假设我可以使用 HashMap 而不是使用 arrayList 来存储我的人员对象?我会将唯一 ID 作为 Integer 参数传递吗?
  • 对你来说 HashSet 是最好的选择。顺便说一句,TreeSet 集合不接受重复和自动排序元素。顺便说一下,Java 中的变量按照惯例应该是驼峰式大小写。它应该是 arrayOfContacts。

标签: java object arraylist


【解决方案1】:

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

【讨论】:

  • 感谢开发者。我现在至少正确地增加了它!我一直在努力避免使用散列集的东西,因为我们还没有在我们的课堂上介绍它。它似乎让事情变得容易多了。
  • @NickM 你本可以在他的帖子中这么说,无论如何,我更新了我的答案。看一看。如果回答了您的问题,请标记为答案。
【解决方案2】:

这里是防止重复 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);

}

【讨论】:

  • 很好,谢谢。我会稍微玩一下这段代码。检查我的编辑,如果我能弄清楚如何正确增加每个用户 ID,我使用的方式会起作用吗?我必须从 1000 开始为每个人对象分配一个唯一的 ID。我想每次创建一个新的人对象时我都会增加一个。问题是,我没有正确递增。
  • 每个人都将拥有相同的 ID,因为您使用了 static 变量。这是一个“类变量”,而不是“实例”变量。如果你想要一个递增的 ID,你需要一个 private int id; 并在你的构造函数中将它设置为 this.id = ++ID
  • 试过了,但它只是给每个人相同的 ID。也许我正在测试以查看每个对象获得哪个 ID 的方式是错误的。呃。
  • 如果你看developer033's solution,他会按照我的暗示行事
  • 啊,我错过了。我现在让它正确递增!谢谢你们。
【解决方案3】:

使用哈希集。对于每个用户的名称,将其添加到 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
}

【讨论】:

  • 我认为不需要 if-else,因为添加相同的名称“没有效果”
  • @cricket_007 也许他想向用户显示一条消息,通知联系人已经存在。但我会做不同的事情(以防止调用 2 个方法 - 包含和添加),因为 add 方法返回一个布尔值,我会这样做:如果 (!nameUsed.add(userName) { then display msg.},所以不需要 ELSE .
  • 是的,这就是我想要的。我在上面评论过,地址簿可以有重复的名字,虽然
【解决方案4】:

你应该在你的 Person 类中覆盖 equals

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
}

当然,用你想要的任何对象替换变量/对象。 您还应该为姓氏和名字添加 getter 和 setter。 希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多