当前位置: 首页 > 知识库问答 >
问题:

当我在ArrayList上输入确切的名称时,为什么“contains”方法返回false?[副本]

申宜
2023-03-14

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

这是我的代码:

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;
    }
}

共有3个答案

商勇
2023-03-14

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

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;
    }

}
马嘉勋
2023-03-14

name是一个String。您的List包含客户实例,而不是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));
}

或者,如果您想搜索具有特定名称的客户实例,可以迭代列表中的元素(使用循环或流)。

例如:

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

这是假设您的客户类有一个getter方法。

齐招
2023-03-14

<代码>列表。contains()使用对象。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 ) ) );

另一种完全不同的方法是将客户对象存储在地图实例中,而不是存储在列表实例中,以名称为键:

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语言的基本命名约定,通常会有所帮助:类名以大写字母开头。

 类似资料:
  • 问题内容: 据我所知,使用或实例化对象分别返回或的新实例。具有 新标识 的新实例对象。 在我实际测试它之前,这对我来说是很清楚的,我注意到它实际上返回了而不是预期的: 如预期的那样,分别使用和创建对象时,也会表现出这种行为: 我可以在状态文档中找到唯一相关的信息: […]例如,return和return 。 如果未提供任何参数,则构造函数将创建一个新的空元组。 可以说,这不足以回答我的问题。 那么

  • 问题内容: Javadoc的方法 doInBackground方法完成后,在事件调度线程上执行。 我已经暗示,对于被取消的工人,情况并非如此。 在每种情况下都会被调用(正常终止或取消),但是当它 未排入 EDT时(通常终止会发生这种情况)。 在取消a的情况下,何时调用有更精确的分析吗? 澄清:这个问题是 不是 就如何一个。在此假定以正确的方式取消。 它是 不是 什么时候他们应该完成的线程仍在工作。

  • 问题内容: 为什么要退货我可以ping通IP。 问题答案: 在很多情况下,方法对我来说并不值得使用。你可以滚动到底部以查看我的替代方法,该方法可以简单地测试你是否在线并且能够解析外部主机(例如google.com)…这似乎通常可以在机器上使用。 问题 关于此有很多chat不休: 这是其他类似的问题: 使用Java检测互联网连接 如何使用Java测试互联网的可用性? 甚至在同一件事上有报告的错误:

  • 问题内容: 在下面的代码中,如果字符串在方法调用之前出现,为什么方法在字符串之前输出?为什么它会跳出输出方法的第一部分的形式,然后离开方法以输出字符串,然后返回到方法以输出方法的返回值? 码: 输出: 问题答案: 首先要注意的是,当对两个操作数使用a时,两个操作数之一是a ,表达式的结果是a 。 因此,在以下方法中调用表达式 您正在调用,因为它是type的变量。注意该方法如何接受单个参数。因此,

  • 问题内容: 我正在使用a 检查我的哈希密码。我有PHP 5.5: 我上车了。我已经检查了posts的值和mysql user_password_hash返回。 我不知道为什么它返回假 有任何想法吗? 问题答案: 手册中的列长度可能是问题所在: 建议将结果存储在可扩展超过60个字符的数据库列中(255个字符是一个不错的选择)。 链接

  • 这个程序可以工作,但我不确定为什么使用的方法必须在方法头中包含。只是作为背景,程序接受一个文本文件,读取它并将其内容保存到(games)中。用户输入文件名和球队名,程序输出特定球队打了多少场比赛,赢了多少场比赛,输了多少场比赛。 它读取的.csv具有以下格式: 下面的所有四个方法(一个返回,另三个返回s),除非我在方法头中输入关键字。如果我只为方法编写或,它们将无法工作。 当被传递到方法中时,是否