Java 向ArrayList添加唯一对象
我正在尝试创建一个基本的移动电话应用程序。我正在尝试(但失败)实现查询手机上现有联系人的功能。为此,我创建了一个方法,该方法返回一个包含联系人的Java 向ArrayList添加唯一对象,java,object,arraylist,Java,Object,Arraylist,我正在尝试创建一个基本的移动电话应用程序。我正在尝试(但失败)实现查询手机上现有联系人的功能。为此,我创建了一个方法,该方法返回一个包含联系人的ArrayList对象。这应该是通过搜索(使用for循环)查看是否存在特定联系人,并将其添加到数组列表中来实现的。此后,该方法应返回一个ArrayList对象,该对象只包含查询结果。但是,在测试我的代码时,我发现每个联系人都被添加到ArrayList,不管它是否匹配查询。以下是我的一些代码片段: Phone.java private ArrayList&
ArrayList
对象。这应该是通过搜索(使用for
循环)查看是否存在特定联系人,并将其添加到数组列表中来实现的。此后,该方法应返回一个ArrayList
对象,该对象只包含查询结果。但是,在测试我的代码时,我发现每个联系人都被添加到ArrayList
,不管它是否匹配查询。以下是我的一些代码片段:
Phone.java
private ArrayList<Contact> contacts;
public Phone() {
this.contacts = new ArrayList<>();
}
public ArrayList<Contact> queryContacts(String contactName) {
ArrayList<Contact> contactsList = new ArrayList<>();
for (Contact contact : this.contacts) {
if (this.findContact(contactName))
contactsList.add(contact);
}
return contactsList;
}
private boolean findContact(String contactName) {
for (Contact contact : this.contacts) {
if (contact.getName().equals(contactName))
return true;
}
return false;
}
public static void main(String[] args) {
char c= 'A';
for (int i = 0; i < 10; i++) {
//Create contacts with unique data
phone.addContact(Contact.createContact("Contact"+c++, "07"+i));
}
System.out.println(phone.queryContacts("VoidContact")); //Dubious entry
System.out.println(phone.queryContacts("ContactB")); //This entry exists
}
我的问题;为什么根据输入的参数输出每个触点而不是唯一触点?非常感谢您的回复。首先,您的代码没有编译:contactsList变量没有在任何地方定义
其次,你的逻辑有缺陷:
for (Contact contact : this.contacts) {
if (this.findContact(contactName))
contactsList.add(contact);
}
return contactsList;
让我们用英语翻译一下:对于每个联系人,如果列表中包含contactName
,则该联系人将添加到列表中。因此,如果列表中包含联系人姓名,则所有联系人都会添加到列表中,否则不会添加任何联系人
您实际需要的是一种方法,可以在列表中查找具有给定名称的联系人:
public List<Contact> queryContacts(String contactName) {
List<Contact> contactsList = new ArrayList<>();
for (Contact contact : this.contacts) {
if (contact.equals(contactName)) {
contactsList.add(contact);
}
}
return contactsList;
}
public List queryContacts(字符串contactName){
列表联系人列表=新的ArrayList();
for(联系人:this.contacts){
如果(contact.equals(contactName)){
联系人列表。添加(联系人);
}
}
返回联系人列表;
}
或者,使用Java 8:
public List<Contact> queryContacts(String contactName) {
return contacts.stream()
.filter(contact -> contact.getName().equals(contactName))
.collect(Collectors.toList());
}
public List queryContacts(字符串contactName){
返回contacts.stream()
.filter(contact->contact.getName().equals(contactName))
.collect(Collectors.toList());
}
首先,您的代码没有编译:contactsList变量没有在任何地方定义
其次,你的逻辑有缺陷:
for (Contact contact : this.contacts) {
if (this.findContact(contactName))
contactsList.add(contact);
}
return contactsList;
让我们用英语翻译一下:对于每个联系人,如果列表中包含contactName
,则该联系人将添加到列表中。因此,如果列表中包含联系人姓名,则所有联系人都会添加到列表中,否则不会添加任何联系人
您实际需要的是一种方法,可以在列表中查找具有给定名称的联系人:
public List<Contact> queryContacts(String contactName) {
List<Contact> contactsList = new ArrayList<>();
for (Contact contact : this.contacts) {
if (contact.equals(contactName)) {
contactsList.add(contact);
}
}
return contactsList;
}
public List queryContacts(字符串contactName){
列表联系人列表=新的ArrayList();
for(联系人:this.contacts){
如果(contact.equals(contactName)){
联系人列表。添加(联系人);
}
}
返回联系人列表;
}
或者,使用Java 8:
public List<Contact> queryContacts(String contactName) {
return contacts.stream()
.filter(contact -> contact.getName().equals(contactName))
.collect(Collectors.toList());
}
public List queryContacts(字符串contactName){
返回contacts.stream()
.filter(contact->contact.getName().equals(contactName))
.collect(Collectors.toList());
}
最好的解决方案是使用HashSet
Set<Contact> collection=new HashSet<Contact>();
//...
for (Contact contact : this.contacts) {
collection.add(concat);
}
在这两种解决方案中,您必须覆盖Contact.class
public boolean equals(Object o){
if(o == null) return false;
if(o instanceof Contact){
Contact c=(Contact)o;
return c.name.equals(this.name);
}
return false;
}
最好的解决方案是使用HashSet
Set<Contact> collection=new HashSet<Contact>();
//...
for (Contact contact : this.contacts) {
collection.add(concat);
}
在这两种解决方案中,您必须覆盖Contact.class
public boolean equals(Object o){
if(o == null) return false;
if(o instanceof Contact){
Contact c=(Contact)o;
return c.name.equals(this.name);
}
return false;
}
您是否发布了您正在尝试的代码?似乎不是,因为在您发布的内容中,在执行contactsList.add(contact)
时,contactsList
从未定义过。因此,这不应该编译successfully@VicSeedoubleyew不知道我是怎么错过的。我已经添加了丢失的代码。谢谢你发布了你正在尝试的代码吗?似乎不是,因为在您发布的内容中,在执行contactsList.add(contact)
时,contactsList
从未定义过。因此,这不应该编译successfully@VicSeedoubleyew不知道我是怎么错过的。我已经添加了丢失的代码。谢谢你的评论。然而,尽管我现在知道这是错误的,但我仍然无法理解原始逻辑中的缺陷?想象一下,联系人包括爱丽丝、鲍勃、卡尔和多米尼克。你在找所有叫卡尔的联系人。您可以通过联系人Alice开始循环。你叫findContact(卡尔)。它返回true,因为列表中存在Carl。因此,您将当前联系人Alice添加到列表中。然后,循环继续与鲍勃。联系人中是否存在Carl。是的,那么让我们将当前联系人Bob添加到列表中。等等等等啊,很好的解释。非常感谢,这确实有助于澄清问题谢谢你的评论。然而,尽管我现在知道这是错误的,但我仍然无法理解原始逻辑中的缺陷?想象一下,联系人包括爱丽丝、鲍勃、卡尔和多米尼克。你在找所有叫卡尔的联系人。您可以通过联系人Alice开始循环。你叫findContact(卡尔)。它返回true,因为列表中存在Carl。因此,您将当前联系人Alice添加到列表中。然后,循环继续与鲍勃。联系人中是否存在Carl。是的,那么让我们将当前联系人Bob添加到列表中。等等等等啊,很好的解释。非常感谢,这确实有助于澄清问题