Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向ArrayList添加唯一对象_Java_Object_Arraylist - Fatal编程技术网

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添加到列表中。等等等等啊,很好的解释。非常感谢,这确实有助于澄清问题