将人员添加到ArrayList,除非它们已经在列表中(firstName和surname字符串)

时间:2017-04-06 07:44:55

标签: java for-loop arraylist

我需要将Person p添加到联系人ArrayList,除非它包含相同的姓氏和名字。

在这种情况下,我需要返回错误消息"无法添加人员#34;。这是我目前的代码:

public class AddressBook {
 private ArrayList<Person> contacts;
   public AddressBook(){
    this.contacts = new ArrayList<Person>();
 }    

  public void addPerson(Person p) {
   for (int i = 0; i < contacts.size(); i++) {
    if(contacts.get(i).getfirstName().equals(p.firstName)){
        System.out.printf("could not add person");
    }
   }
   this.contacts.add(p);
  }            

我无法弄清楚如何将要通过addPerson()方法添加的字符串与已包含在列表中的Person对象中包含的现有字符串进行比较。

5 个答案:

答案 0 :(得分:1)

我认为您不应该使用List来执行此操作。如果您想要一个拒绝重复的集合,您应该使用Set

所以在我看来你应该改变你的代码:

public class AddressBook {

  // You have to use a LinkedHashSet instead of a HashSet if you want to keep order
  private Set<Person> contacts = new HashSet<>();

  // v1 : add p only if not present in contacts and don't log anything
  public void addPerson(Person p) {
    contacts.add(p);
  }

  // v2 : log if duplicate
  public void addPerson(Person p) {
    if(contacts.contains(p))
      System.out.println("Duplicate here");
    else
      contacts.add(p);
  }

  // If you really need an List (maybe to be compatible with an API ?)
  public List<Person> asList() {
    return new ArrayList<>(contacts);
  }
} 

要使用此代码,您必须在hashCode课程中实施equalsPerson方法。但我认为这是一种更好的方法。

答案 1 :(得分:1)

真正的诀窍是:退后一步,改进你的模型。

实际上你说的是:当两个Person对象具有相同名/姓时;那么你想把它们视为相等

从这个意义上讲:只需前进并覆盖该Person类中的equals(和hashCode);请参阅here了解如何更详细地执行此操作。

因为那时你可以退后一步;并使用Java集合的许多内置功能;喜欢List.contains()方法!你既没有也不应该自己实施这种检查。相反,你看看&#34;框架&#34;作品;并使您的代码在框架内工作。

除此之外:我明白这可能是为了学习&#34;目的;但是:在现实世界中;两个人不一定是因为他们分享他们的名字而是同一个人。恰恰相反:一个真实的地址簿应该允许添加多个具有不同地址的John Doe人(可能在执行时发出警告;但仍然:允许它)。

答案 2 :(得分:0)

public void addPerson(Person p) {
    boolean isInList=false;
    for(Person per : contacts){
        if(per.getfirstName().equals(p.firstName)&&per.getsurName().equals(p.surName)){
            System.out.printf("could not add person");
            isInList=true;
        }
    }
    if(!isInList){
        this.contacts.add(p):
    }
}

此代码检查列表中是否已存在姓氏和名字相同的人。如果是,它不会被添加,否则它会被添加。可能存在的唯一缺陷是,如果您在列表中有1个大写字母的人并且想要使用小写字母添加相同的姓氏和名字,则可以拥有相同的“人”

答案 3 :(得分:0)

每当调用addPerson方法时,也会调用contacts.add(p)。在if条件中添加return语句,如果列表具有相同的名字和姓氏对象,则不会调用。

public void addPerson(Person p) {        
      for (int i = 0; i < contacts.size(); i++) {
        Person p2=contacts.get(i);
        if(p2.getfirstName().equals(p.firstName) && p2.getSurName().equals(p.surName)){
            System.out.printf("could not add person");
            return;
        }
    }
    this.contacts.add(p);
}

答案 4 :(得分:0)

在Person对象中实现hashCode和equals方法如下

@Override
public int hashCode() {
    return Objects.hash(firstName.toLowerCase(), lastName.toLowerCase());
}

@Override
public boolean equals(Object obj) {
    if(null != obj && obj instanceof Person) {
        return this.firstName.equalsIgnoreCase(((Person)obj).getFirstName()) && this.lastName.equalsIgnoreCase(((Person)obj).getLastName());
    }
    return false;
}

这将确保仅当firstName和lastName是唯一的时才添加Person对象。