You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java登录系统:如何匹配LinkedList中登录用户并返回其姓名

解决方案

针对你遇到的两个问题,通过以下步骤修改代码即可实现需求:

1. 修复登录验证逻辑,确保邮箱与密码属于同一用户

当前代码分别按邮箱、密码独立查找用户,会导致不同用户的邮箱和密码交叉匹配也能登录。正确逻辑应该是:先通过邮箱找到用户,再验证该用户的密码是否匹配输入值,只有二者同时满足才算登录成功。

2. 保存当前登录用户,避免固定取第一个用户

在Session类中新增成员变量存储当前登录用户,登录成功后赋值,后续菜单直接调用该变量获取用户信息。

3. 给SuperMarket类添加姓名访问方法

由于SuperMarket的name是私有属性,新增getName()方法对外提供姓名获取能力,无需修改原有toString方法(若需保留其返回邮箱的功能)。


修改后的关键代码

Session类修改片段

public class Session {
    // 新增:存储当前登录用户
    private SuperMarket currentUser;
    private LinkedList<SuperMarket> members = new LinkedList<SuperMarket>();

    // ... 原有代码保留 ...

    public void login() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Email: ");
        String email = scanner.nextLine();
        System.out.print("Password: ");
        String password = scanner.nextLine();

        // 先通过邮箱定位用户
        SuperMarket user = member(email);
        // 验证用户存在且密码匹配
        if (user != null && user.hasPassword(password)) {
            currentUser = user; // 保存当前登录用户
            adminMenu(); // 调用当前实例的菜单方法,不要新建Session
        } else {
            System.out.println("Incorrect SuperMarket details!");
        }
    }

    public void adminMenu() {
        System.out.println("Admin Menu:");
        System.out.println("C- Add Membership");
        System.out.println("R- View Membership");
        System.out.println("U- Update Membership");
        System.out.println("D- Delete Membership");
        System.out.println("V- View Memberships");
        System.out.println("M- MMS Menu");
        System.out.println("X- Logout");
        // 使用当前登录用户的姓名
        System.out.print("Session Admin: " + currentUser.getName() + " - Menu Commands (C/R/U/D/V/M/X): ");
    }

    // ... 原有代码保留 ...
}

SuperMarket类修改片段

public class SuperMarket {
    private String name;
    private String email;
    private String password;
    private Memberships Memberships;
    private MMSLog MMSLog;

    // ... 原有代码保留 ...

    // 新增:获取用户姓名的方法
    public String getName() {
        return name;
    }

    // ... 原有代码保留 ...
}

额外优化建议

  • 原代码中readEmail()、readPassword()各自创建Scanner实例,建议统一复用一个Scanner,减少资源消耗(上述login方法已合并处理)
  • 可将输入的命令字符统一转为大写(或小写),避免大小写敏感导致的命令识别问题

内容的提问来源于stack exchange,提问作者cs010101111000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:05:48