Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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中输入确切的名称时,为什么contains方法返回false?_Java_Arraylist_Contains - Fatal编程技术网

Java 当我在ArrayList中输入确切的名称时,为什么contains方法返回false?

Java 当我在ArrayList中输入确切的名称时,为什么contains方法返回false?,java,arraylist,contains,Java,Arraylist,Contains,我正在尝试做一个程序,可以添加客户的姓名,年龄,联系电话和电子邮件。我想搜索用户想要的名称,但即使我输入了完全相同的名称,它也不会搜索该名称。如何解决这个问题 这是我的密码: package com.company; import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan

我正在尝试做一个程序,可以添加客户的姓名,年龄,联系电话和电子邮件。我想搜索用户想要的名称,但即使我输入了完全相同的名称,它也不会搜索该名称。如何解决这个问题

这是我的密码:

package com.company;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        ArrayList<customers> customers = new ArrayList<>();
        customers.add(new customers("Zen",19,"0912121212","zen@gmail.com"));
        customers.add(new customers("Mary",20,"09134343434","mary@gmail.com"));
        System.out.println("Enter name: ");
        String name = scan.nextLine();
        System.out.println(customers.contains(name));
    }
}
class customers{
    private String name;
    private int age;
    private String contactNumber;
    private String email;

    public customers(String name, int age, String contactNumber, String email) {
        this.name = name;
        this.age = age;
        this.contactNumber = contactNumber;
        this.email = email;
    }
}
名称是一个字符串。您的列表包含客户实例,而不是字符串。因此,您的列表不包含名称

要通过另一种类型的键查找一种类型的实例,可以使用映射:


这是假设您的customers类有一个getName getter方法。

为您的类添加另一个构造函数以获得名称,并为相同的名称迭代数组列表中的所有对象

List.containsuses Object.equals确定对象是否已在该列表中

因此,一种方法可能是覆盖该方法:

public class Customer
{
  private String m_Name;
  private int m_Age;
  …

  @Override
  public final boolean equals( final Object o )
  {
    return o instanceof String name && name.equals( m_Name );
  }
}
虽然这会起作用,但不建议以这种方式实现equals(将其视为起点)

相反,您应该在列表中搜索名称:

String name = scan.nextLine();
System.out.println( customers.stream().anyMatch( c -> c.getName().equals( name ) ) );
另一种完全不同的方法是将Customer对象存储在Map实例中,而不是列表实例中,并将名称作为键:

public class Main 
{
  public static void main( String... args ) 
  {
    Scanner scan = new Scanner(System.in);
    Map<String,Customer> customers = new HashMap<>();
    var customer = new Customer( "Zen", 19, "0912121212", "zen@gmail.com" );
    customers.put( customer.getName(), customer );
    customer = new Customer( "Mary", 20, "09134343434", "mary@gmail.com" );
    customers.put( customer.getName(), customer );
    System.out.println( "Enter name: " );
    String name = scan.nextLine();
    System.out.println( customers.containsKey( name ) );
  }
}

最后,如果您遵循Java语言的基本命名约定,通常会有所帮助:类名以大写字母开头。

这里的问题是您没有用字符串类型定义ArrayList。如果要将客户保留在列表中,可以尝试以下解决方案:

for(customers c:customers){
if(c.getName().equals(name)){
System.out.println(true);
}
 }

确保创建一个getter getName。

您已将水果篮添加到数组列表中,并询问是否有芒果。我应该在代码中更改什么?@Eran我应该怎么做?我想他没有阅读DS地图。
String name = scan.nextLine();
System.out.println( customers.stream().anyMatch( c -> c.getName().equals( name ) ) );
public class Main 
{
  public static void main( String... args ) 
  {
    Scanner scan = new Scanner(System.in);
    Map<String,Customer> customers = new HashMap<>();
    var customer = new Customer( "Zen", 19, "0912121212", "zen@gmail.com" );
    customers.put( customer.getName(), customer );
    customer = new Customer( "Mary", 20, "09134343434", "mary@gmail.com" );
    customers.put( customer.getName(), customer );
    System.out.println( "Enter name: " );
    String name = scan.nextLine();
    System.out.println( customers.containsKey( name ) );
  }
}
for(customers c:customers){
if(c.getName().equals(name)){
System.out.println(true);
}
 }