我需要将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对象中包含的现有字符串进行比较。
答案 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
课程中实施equals
和Person
方法。但我认为这是一种更好的方法。
答案 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对象。