为啥当我在我的 ArrayList 上输入确切的名称时,“包含”方法返回 false? [复制]

Posted

技术标签:

【中文标题】为啥当我在我的 ArrayList 上输入确切的名称时,“包含”方法返回 false? [复制]【英文标题】:Why does the 'contains' method return false when I enter the exact name on my ArrayList? [duplicate]为什么当我在我的 ArrayList 上输入确切的名称时,“包含”方法返回 false? [复制] 【发布时间】:2021-08-03 10:41:42 【问题描述】:

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

这是我的代码:

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;
    

【问题讨论】:

您已将水果篮添加到数组列表中并询问是否有芒果。 我应该在我的代码中更改什么? @Eran 我该怎么办? 【参考方案1】:

List.contains()使用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()(请参阅here 作为起点)。

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

String name = scan.nextLine();
System.out.println( customers.stream().anyMatch( c -> c.getName().equals( name ) ) );

一种完全不同的方法是将Customer 对象存储在List 的实例中而不是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 语言的基本命名约定,一般会有所帮助:类名以大写字母开头。

【讨论】:

你能链接到这些约定吗? (权威参考。) @PeterMortensen – 试试这个:oracle.com/technetwork/java/codeconventions-150003.pdf【参考方案2】:

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

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

 

确保创建一个 getter ( getName() )。

【讨论】:

【参考方案3】:

nameString。您的 List 包含 customers 实例,而不是 Strings。因此,您的 List 不包含 name

为了通过另一种类型的键查找一种类型的实例,您可以使用Map

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

或者,如果您想搜索具有特定名称的 customers 实例,您可以遍历 List 的元素(使用循环或 Stream)。

例如:

System.out.println(customers.stream().anyMatch(c -> c.getName().equals(name)));

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

【讨论】:

我认为他没有读过 DS 地图。【参考方案4】:

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

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();
        customers obj = new customers(name);
        customers toBeChecked;
        for (int i=0; i<customers.size(); i++) 
            toBeChecked = customers.get(i);
            if(toBeChecked.getName().equals(obj.getName())) 
                System.out.println("Same 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;
    
    public customers (String name) 
    this.name = name;
    
    public String getName() 
        return name;
    


【讨论】:

以上是关于为啥当我在我的 ArrayList 上输入确切的名称时,“包含”方法返回 false? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 innerHTML 方法无法在我的联系表单中列出内容?

当我在 vue 组件上输入另一个输入时,为啥输入文件的值丢失?

当我在 Thread 对象上调用 run() 时,为啥我的 Java 程序会泄漏内存?

当我使用 ajax 发布请求时,为啥在我的 live laravel 项目中显示 404 和 405

当我在我的 android 应用程序中从图库中加载图像时,为啥位图返回较小的图像?

为啥我在使用 Paypal 付款后在我的商店中得到一个空白页面?