尝试在 Arraylist 中使用 contains() 时,找不到我在找的东西

Posted

技术标签:

【中文标题】尝试在 Arraylist 中使用 contains() 时,找不到我在找的东西【英文标题】:While trying to use contain() in Arraylist it doesn't find what I'm looking 【发布时间】:2022-01-23 21:46:32 【问题描述】:

所以我有一个像这样名为 Student 的班级:

public class Student 
    public int usercounter;
    public String username,password,studentname;
    Student(String studentname ,String username, String password, int usercounter)
        this.studentname = studentname;
        this.username = username;
        this.password = password;
        this.usercounter = usercounter;
    

我正在尝试使用 Arraylists 编写库登录代码。

static ArrayList<Student> users = new ArrayList<Student>();

我的主菜单如下所示:

public static void MainMenu() 
        while (menubreak)
            System.out.println("ULIS Main Menu\nPlease choose the feature you want to access:\n1-Login\n2-Create User\n3-Delete User\n4-Exit");
            gir = Input.nextInt();
            Input.nextLine();
                switch (gir) 
                    case 1:
                        Login();
                        break;

我创建这样的用户:

public static void CreateUser() 
        while (userbreak) 
            System.out.println("You are creating a new User");
            System.out.println("Please enter the name of the Student:");
            tempStudentname = Input.nextLine();
            System.out.println("Please enter a new username:");
            tempUsername = Input.nextLine();
            System.out.println("Please enter a new password:");
            tempPassword = Input.nextLine();
            users.add(new Student(tempStudentname, tempUsername, tempPassword, usercounter));
            usercounter++;

我的登录屏幕如下所示:

public static void Login() 
        System.out.println("Please choose the user type you want to login:\n1-Admin\n2-Student");
        giris = Input.nextInt(); Input.nextLine();
            switch (giris) 
                    case 2:
                    System.out.println("Please enter your username:");
                    tempUsername = Input.nextLine();
                    searchUsername = tempUsername;
                    System.out.println("Please enter your password:");
                    tempPassword = Input.nextLine();
                    if(users.contains(searchUsername) && users.contains(tempPassword) )
                        System.out.println("User found, logging in now");
                        UserMenu();
                    
                    else
                        System.out.println("User cannot be found, returning to Main Menu");
                    
            
    

当我运行它时,它会转到“找不到用户” 我不允许使用离线数据库或类似的东西,这就是为什么我在旅途中创建用户名并且不将它们存储在某些东西中的原因。 它找不到它正在寻找的用户名和密码的原因可能是什么?顺便说一句,我是一年级的学生,如果可以的话,请尝试在不使用复杂技术的情况下进行解释

【问题讨论】:

您没有向我们展示users 是如何创建或填充的,因此很难为您提供帮助。 (您也在同一个列表中查找用户名和密码似乎很奇怪......)请提供minimal reproducible example。 假设用户是List&lt;Student&gt;,那么您的#contains 调用就会出错。我冒昧地猜测您使用的是原始类型列表,它允许您首先执行此操作。展示您如何设置 users 字段。 你应该遵循 Java 命名约定:方法名是用驼峰命名的。 【参考方案1】:

您当前正在将 Student 对象与学生姓名进行比较,但有一个简单的解决方法,假设我们有以下代码:

List<Student> students = new ArrayList<>();
students.add(new Student("Bob", "password"));
students.add(new Student("Alice","wonderland"));

然后,当您从用户输入中获得tempUsernametempPassword 时,您可以遍历列表并检查是否存在具有该名称和密码的学生:

Student loggedIn = null;
for(Student student : students)
    if(student.getName().equals(tempUsername) && student.checkPassword(tempPassword))
        loggedIn = student; 
        break;
    

(注意这里我为学生添加了一些getter和setter方法,现在看起来像这样更好地封装)

class Student 
    private String name;
    private String password;

    public Student(String name, String password)
        this.name = name;
        this.password = password;
    

    public String getName()
        return name;
    

    public boolean checkPassword(String password)
        return this.password.equals(password);
    

如果您被特别要求使用ArrayList 执行此操作,那很好,但如果您可以使用其他数据结构,您可以考虑使用HashMaps(您可以有一个HashMap&lt;String,Student&gt;,您可以通过在学生的用户名中,如果它在HashMap中,则取回学生,这将是更好的时间复杂度,或者更好的是,定义您自己的可比较接口并使用HashSet,这样您就可以进行可比较的比较用户名,这也有助于防止添加具有相同用户名的用户)。

【讨论】:

以上是关于尝试在 Arraylist 中使用 contains() 时,找不到我在找的东西的主要内容,如果未能解决你的问题,请参考以下文章

在带有整数数组的 ArrayList 上使用 contains

慎用ArrayList的contains方法,使用HashSet的contains方法代替

ArrayList 的 contains() 方法如何评估对象?

Arraylist中contains方法底层实现解读与HashSet自定义类型去重效果的简述(接上一篇)

JAVA 中 2个ArrayList 比较~

HashSet的contains()和ArrayList的contains()方法哪个更快一些?