为啥当我在我的 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】:name
是String
。您的 List
包含 customers
实例,而不是 String
s。因此,您的 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