先分析一下都要做什么

员工管理系统

都要实现什么功能?
添加员工、查询员工、修改信息、删除员工、退出程序

主菜单分析

当打开程序后,先提示操作方式information
告诉用户如何使用此程序 再考虑如何制作功能
利用switch()语句,case scanner.next():
来 get 输入的值,需要注意的是 是否会存在其他数值
default的可能性,且需要保持"人性化"提示

"你输入的有误,请重新输入你要进行的操作!"
利用标签给予while(),类似judge:while(),当输入有错时
使用continue judge;返回至重新输入选项 而不是主菜单

主菜单伪代码

输入一个数并存值;
switch(值){
    case "选项1":
        code;
        break;
    case "选项2":
        code;
        break;
    default:
        输入错误提示;
        code;
    // 其中如果 case "5": 直接使用
    // System.exit(0); 退出程序即可
}

添加员工

添加员工本质上很简单,即提示输入信息
将信息存入数组username[]
idIndex来记录"编号",也就是所谓的UUID
当存入信息完成后,idIndex++来保证编号自增
添加成功后提示: [◎] 操作成功!你添加了员工: "username" (编号: "id").
这样写看起来更加直观,也更方便用户的体验
String userName = scanner.next(); // 输入
username[username.length-1] = userName; // 记录姓名
id[username.length-1] = idIndex; // 记录编号
inCompany[username.length-1] = true; // 记录在职状态
idIndex++; // 编号自增

添加员工额外功能

当添加员工时,username[]id[]会进行扩容
数组的长短和存入数据的多少关联,省下空间
同时会有一个额外的数组inCompany[]来记录状态
这个状态代表的是 他是否"在职"
添加这个额外的状态是为了方便以后查询信息以及删除的操作

"人性化"操作,人性化一直是我喜欢做的东西
添加员工这个功能中,我把人性化放在了添加结束后,提示以下内容
[!] 是否要继续添加员工?若否将返回至主菜单!
[!] (yes/no):
如果为yes,直接输入员工名字即可
如果为no,返回至主菜单,利用标签 continue start;
当然,在这个选项中,我也做了default即输入有误的状态提示,与主菜单选项错误一样


查询员工

查询员工应该是花费我时间最久的功能
先简单分析一下,查询员工,通过 ID 查询很容易
但我制作了可以通过 username 查询的功能

主要流程如下:
进入查询员工菜单后
有三个选项 1.查询某个员工信息 2.查询员工列表 3.返回主菜单

查询某个员工信息中,里面有 通过ID查询、通过名字查询以及返回上一级
返回上一级 即返回至查询员工菜单界面 而非主菜单 (人性化体验)


首先要明白,ID是唯一的,所以在循环遍历查找中
只要找到了,则直接输出内容 或 记录index角标 在循环结束后输出
紧接着就要break; 没必要全部都要查找,提高程序效率
System.out.print("# [!] 请输入你要查询员工的编号: ");
int tempID = scanner.nextInt();
boolean isFound = false; // 用来记录是否找到了
int searchIndex; // 用来存下角标
for (int i=0; i<id.length;i++) {
    if (id[i]==tempID) {
        isFound = true; // 如果找到了 那么为true
        searchIndex = i; // 然后记录角标
        break;
    }
}
if(isFound) {
    code;
} else {
    code;
}

思路和ID查询一样
不同的是,姓名可能会存在"相同"的情况,即重名,但ID(UUID)是唯一的
建立一个新系列数组FoundXx[],当找到名字符合的,就存入
最后通过FoundXx[]将数据打印出来,与"查询员工列表"方式一样
查询员工列表的方式可以往下看

为什么要做员工列表这个功能?
考虑到了用户的体验,显示列表可以更直观的观察数据
遍历数组中,若id[index]==0则说明数据不存在或有误
将会跳过本次输出,仅输出正确的数据
for遍历username[]{
    if(id[index]!=0) {
        // 输出的时候还有一列数据关于 在职还是离职
        // 所以要判断他是否在职,然后赋值给临时的变量 status
        // 最后输出的时候 字符串拼接 status
        inCompany[index]==true?status="在职":status="已离职";
        输出;
        code;
    }
}

查询员工额外功能

查询员工列表将会打印所有员工的信息 按照顺序(在职 > 已离职)
这就运用到了当时的inCompany[]数组的作用
在职的员工排序会在已离职员工的前面
其实就是先输出在职的,把已离职的存入新数组,最后输出

即使是已离职的状态,依旧可以查找到该员工的信息
类似一个档案或存档,只是在最后面的状态显示已离职
个人感觉,如果删除员工就无法查询到信息太牵强

// 查询员工列表时,如何 在职 > 已离职
for遍历username[]{
    if(inCompany[index]==true) { // 代表的是在职
        code;
    } else { // 代表的是已离职
        将数据存入另外一个新数组内;
    }
}
for遍历新数据[]{
    输出已离职的员工信息;
}

一些细节

当查询完毕一个数据后,可以选择继续查询还是返回至主菜单
即使没有查询到数据,也可以继续查询
各种回复错误的状态,例如不按照要求输入内容的提示
// 当使用**查询员工列表**功能时 但列表中没有数据
System.out.println("# [!] 看起来你的公司目前好像没有员工,现在就来添加一个员工吗?");
System.out.println("# [!] 是否要现在添加员工?若否将返回至主菜单!");
System.out.print("# [!] (yes/no): ");  
// 如果选择添加员工 直接会跳到条件员工的程序内

修改员工信息

首先上来直接开始分析,什么是修改员工信息
当输入一个编号ID后,查询是否有这个人的信息,再修改username[index]
所以,在修改前要引入一个查询
由于目前并没有学到函数,所以在switch直接把查询的复制粘贴过来了
当通过编号ID找到了这个人,才开始进行修改,所以整个修改很简单
if (isFoundID) {
    username[index] = scanner.next();
    // 这里的index 是在for做id遍历的时候 额外存的值
    code;
} else {
    sout("提示: 没有查询到这个人");
    code;
}

一些细节

当然,还是加了那些额外的小功能
查询不到人的时候,提示以下内容,并可以继续使用修改功能
[❌] 看起来你的公司并没有此编号的员工!你仍然可以继续使用修改功能!
修改成功后,提示以下内容,并可以进行选择
[◎] 刚刚的操作已经结束!是否要继续修改?若否将返回至主菜单!


删除员工

与其说是删除功能,不如说成修改功能
还是先通过编号ID查找,然后再进行修改最后的状态
本质上并没有真正的删除,只是用到了之前定义的inCompany[]数组
通过更改里面的值,改为false,即可做到已离职的状态
if (isFoundID) {
    inCompany[index] = scanner.next();
    code;
} else {
    sout("提示: 没有查询到这个人");
    code;
}

这里需要注意一下

我直接修改inCompany[]内的值,是因为我在查询员工的时候
后边有一个关于员工状态的项
而且我想做到的是留存记录、留存档案,并不是真正意义上的删除

若要做到真正的删除,需要将此位置记录角标index
index后面的所有数据往前移动,最后将数组减容
数组减容数组扩容一样,为了省下更多的空间


整体代码

public static void main(String[] args) {
        int idIndex = 1001;
        int primary = 0;
        String [] username = new String[1];
        int [] id = new int[1];
        boolean [] inCompany = new boolean[1];
        start:while (true) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("#############################");
            System.out.println("#     欢迎使用员工管理系统      ");
            System.out.println("#############################");
            System.out.println("# 1.添加员工         2.查询员工");
            System.out.println("# 3.修改信息         4.删除员工");
            System.out.println("# 5.退出程序");
            System.out.println("#############################");
            System.out.print("# [!] 请选择你要进行的操作: ");
            String flag = scanner.next();
            judge:while(true) {
                switch (flag) {
                    case "1":
                        // 这里进行了自增 防止数组超出界限
                        String [] tempUsername = new String[username.length+1];
                        int [] tempId = new int[username.length+1];
                        boolean [] tempInCompany = new boolean[username.length+1];
                        for (int i = 0; i < username.length; i++) {
                            tempUsername[i]=username[i];
                            tempId[i]=id[i];
                            tempInCompany[i]=inCompany[i];
                        }
                        username=tempUsername;
                        id=tempId;
                        inCompany=tempInCompany;
                        System.out.print("# [!] 请输入你要添加的员工姓名:");
                        username[primary] = scanner.next();
                        id[primary] = idIndex;
                        inCompany[primary] = true;
                        System.out.println("# [◎] 操作成功!你添加了员工: "+username[primary] + " (编号: "+idIndex+").");
                        idIndex++;
                        primary++;
                        System.out.println("# [!] 是否要继续添加员工?若否将返回至主菜单!");
                        System.out.print("# [!] (yes/no): ");
                        String yesNo = scanner.next();
                        yesOrNo:while(true) {
                            switch (yesNo) {
                                case "yes":
                                    continue judge;
                                case "no":
                                    continue start;
                                default:
                                    System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                    System.out.println("# [!] 是否要继续添加员工?若否将返回至主菜单!");
                                    System.out.print("# [!] (yes/no): ");
                                    yesNo = scanner.next();
                                    continue yesOrNo;
                            }
                        }
                        // 需要保存的信息
                        // 工号 不能输入 自动生成的
                        // 员工姓名
                        // 员工和工号的姓名都是保存到数组里的
                    case "2":
                        search:while(true) {
                            System.out.println("# [!] 1. 查询某个员工信息  2. 查询员工列表  3.返回主菜单");
                            System.out.print("# [◎] 请选择你要进行的操作: ");
                            String searchNumStr = scanner.next();
                            searchNumber:while(true) {
                                switch (searchNumStr) {
                                    case "1":
                                        whichSearch:while (true) {
                                            System.out.println("# [!] 1. 通过ID进行查询  2. 通过名字进行查询  3.返回上一级");
                                            System.out.print("# [◎] 请选择你要进行的操作: ");
                                            String whichSearchStr = scanner.next();
                                            switch (whichSearchStr) {
                                                case "1":
                                                    System.out.print("# [!] 请输入你要查询员工的编号: ");
                                                    int tempID = scanner.nextInt();
                                                    boolean isFound = false;
                                                    int searchIndex=0;
                                                    for (int i=0; i<id.length;i++) {
                                                        if (id[i]==tempID) {
                                                            isFound = true;
                                                            searchIndex = i;
                                                            break;
                                                        }
                                                    }
                                                    if (isFound) {
                                                        System.out.println("# [◎] 已经为你查询到以下信息: ");
                                                        System.out.println("# 编号\t | 员工姓名\t | 状态");
                                                        String status;
                                                        if (inCompany[searchIndex]) {
                                                            status="在职";
                                                        } else {
                                                            status="已离职";
                                                        }
                                                        System.out.println("# "+id[searchIndex]+"\t|"+username[searchIndex]+"\t\t|"+status);
                                                        System.out.println();

                                                    } else {
                                                        System.out.println("# [❌] 看起来你的公司并没有此编号的员工!你仍然可以继续查询!");
                                                    }
                                                    System.out.println("# [◎] 查询已经结束!是否要继续查询?若否将返回至主菜单!");
                                                    System.out.print("# [!] (yes/no): ");
                                                    String yesNo4 = scanner.next();
                                                    yesOrNo4:while(true) {
                                                        switch (yesNo4) {
                                                            case "yes":
                                                                continue whichSearch;
                                                            case "no":
                                                                continue start;
                                                            default:
                                                                System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                                                System.out.println("# [!] 是否要继续查询?若否将返回至主菜单!");
                                                                System.out.print("# [!] (yes/no): ");
                                                                yesNo4 = scanner.next();
                                                                continue yesOrNo4;
                                                        }
                                                    }
                                                case "2":
                                                    System.out.print("# [!] 请输入你要查询员工的姓名: ");
                                                    Scanner sc = new Scanner(System.in);
                                                    String tempUserName = sc.next();
                                                    boolean isFoundUserName = false;
                                                    String [] FoundUserNameStr = new String[username.length];
                                                    int [] FoundUserIDStr = new int[id.length];
                                                    boolean [] FoundUserInCompany = new boolean[inCompany.length];
                                                    int searchUserIndex=0;
                                                    for (int i=0; i<username.length;i++) {
                                                        if (Objects.equals(username[i], tempUserName)) {
                                                            isFoundUserName = true;
                                                            FoundUserIDStr[searchUserIndex] = id[i];
                                                            FoundUserNameStr[searchUserIndex] = username[i];
                                                            FoundUserInCompany[searchUserIndex] = inCompany[i];
                                                            searchUserIndex++;
                                                        }
                                                    }

                                                    if (isFoundUserName) {
                                                        System.out.println("# [◎] 已经为你查询到以下信息: ");
                                                        System.out.println("# [!] 员工列表: ");
                                                        System.out.println("# 编号\t | 员工姓名\t | 状态");
                                                        for (int i=0;i<FoundUserIDStr.length;i++) {
                                                            String status;
                                                            if (FoundUserInCompany[i]) {
                                                                status="在职";
                                                            } else {
                                                                status="已离职";
                                                            }
                                                            if (FoundUserIDStr[i]!=0) {
                                                                System.out.println("# "+FoundUserIDStr[i]+"\t|"+FoundUserNameStr[i]+"\t\t|"+status);
                                                            }
                                                        }
                                                    } else {
                                                        System.out.println("# [❌] 看起来你的公司并没有此名字的员工!你仍然可以继续查询!");
                                                    }
                                                    System.out.println("# [◎] 查询已经结束!是否要继续查询?若否将返回至主菜单!");
                                                    System.out.print("# [!] (yes/no): ");
                                                    String yesNo5 = scanner.next();
                                                    yesOrNo5:while(true) {
                                                        switch (yesNo5) {
                                                            case "yes":
                                                                continue whichSearch;
                                                            case "no":
                                                                continue start;
                                                            default:
                                                                System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                                                System.out.println("# [!] 是否要继续查询?若否将返回至主菜单!");
                                                                System.out.print("# [!] (yes/no): ");
                                                                yesNo5 = scanner.next();
                                                                continue yesOrNo5;
                                                        }
                                                    }
                                                case "3":
                                                    continue search;
                                                default:
                                                    System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                                    continue whichSearch;
                                            }
                                        }
                                    case "2":
                                        if (username[0]!=null) {
                                            System.out.println();
                                            System.out.println("# [!] 员工列表: ");
                                            System.out.println("# 编号\t | 员工姓名\t | 状态");
                                            int deleteIndexPos=0;
                                            String [] deleteUsernameStr = new String[username.length];
                                            int [] deleteUserid = new int[username.length];
                                            for (int i=0;i<username.length;i++) {
                                                String status;
                                                if (inCompany[i]) {
                                                    status="在职";
                                                    if (id[i]!=0) {
                                                        System.out.println("# "+id[i]+"\t|"+username[i]+"\t\t|"+status);
                                                    }
                                                } else {
                                                    status = "已离职";
                                                    deleteUsernameStr[deleteIndexPos] = username[i];
                                                    deleteUserid[deleteIndexPos] = id[i];
                                                    deleteIndexPos++;
                                                }
                                                if (i == username.length) {
                                                    System.out.println();
                                                }
                                            }
                                            for (int i = 0; i < deleteUsernameStr.length; i++) {
                                                if (deleteUserid[i]!=0) {
                                                    System.out.println("# " + deleteUserid[i] + "\t|" + deleteUsernameStr[i] + "\t\t|" + "已离职");
                                                }
                                            }

                                            System.out.println();
                                            System.out.println("# [◎] 查询已经结束!是否要继续查询?若否将返回至主菜单!");
                                            System.out.print("# [!] (yes/no): ");
                                            String yesNo3 = scanner.next();
                                            yesOrNo3:while(true) {
                                                switch (yesNo3) {
                                                    case "yes":
                                                        continue search;
                                                    case "no":
                                                        continue start;
                                                    default:
                                                        System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                                        System.out.println("# [!] 是否要继续查询?若否将返回至主菜单!");
                                                        System.out.print("# [!] (yes/no): ");
                                                        yesNo3 = scanner.next();
                                                        continue yesOrNo3;
                                                }
                                            }
                                        } else {
                                            System.out.println("# [!] 看起来你的公司目前好像没有员工,现在就来添加一个员工吗?");
                                            System.out.println("# [!] 是否要现在添加员工?若否将返回至主菜单!");
                                            System.out.print("# [!] (yes/no): ");
                                            String yesNo2 = scanner.next();
                                            yesOrNo2:while(true) {
                                                switch (yesNo2) {
                                                    case "yes":
                                                        flag = "1";
                                                        continue judge;
                                                    case "no":
                                                        continue start;
                                                    default:
                                                        System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                                        System.out.println("# [!] 是否要现在添加员工?若否将返回至主菜单!");
                                                        System.out.print("# [!] (yes/no): ");
                                                        yesNo2 = scanner.next();
                                                        continue yesOrNo2;
                                                }
                                            }
                                        }
                                    case "3":
                                        continue start;
                                    default:
                                        System.out.println("# [!] 1. 查询某个员工信息  2. 查询员工列表  3.返回主菜单");
                                        System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                        System.out.println("# [◎] 请选择你要进行的操作: ");
                                        searchNumStr = scanner.next();
                                        continue searchNumber;
                                }
                            }
                        }
                        // 根据工号查询
                        // 可以做姓名查询
                        // 加一个子菜单
                        // 排序 根据工号倒叙排序
                    case "3":
                        revise:while(true) {
                            System.out.print("# [!] 请输入你要修改员工的编号: ");
                            int reviseId = scanner.nextInt();

                            boolean isFoundRevised = false;
                            int reviseIndex=0;
                            for (int i=0; i<id.length;i++) {
                                if (id[i]==reviseId) {
                                    isFoundRevised = true;
                                    reviseIndex = i;
                                    break;
                                }
                            }
                            if (isFoundRevised) {
                                System.out.println("# [◎] 已经为你找到了该员工: ");
                                System.out.println("# 编号\t | 员工姓名\t | 状态");
                                String status="";
                                if (inCompany[reviseIndex]) {
                                    status="在职";
                                } else {
                                    status="已离职";
                                }
                                System.out.println("# "+id[reviseIndex]+"\t|"+username[reviseIndex]+"\t\t|"+status);
                                System.out.println();
                                System.out.print("# [!] 请输入你要修改的名字: ");
                                String backUserName = username[reviseIndex];
                                username[reviseIndex] = scanner.next();
                                System.out.println("# [◎] 修改成功!原员工: "+backUserName+",已经改名为: "+username[reviseIndex]+" (编号"+id[reviseIndex]+")");
                            } else {
                                System.out.println("# [❌] 看起来你的公司并没有此编号的员工!你仍然可以继续使用修改功能!");
                            }
                            System.out.println("# [◎] 刚刚的操作已经结束!是否要继续修改?若否将返回至主菜单!");
                            System.out.print("# [!] (yes/no): ");
                            String yesNo6 = scanner.next();
                            yesOrNo6:while(true) {
                                switch (yesNo6) {
                                    case "yes":
                                        continue revise;
                                    case "no":
                                        continue start;
                                    default:
                                        System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                        System.out.println("# [!] 是否要继续修改?若否将返回至主菜单!");
                                        System.out.print("# [!] (yes/no): ");
                                        yesNo6 = scanner.next();
                                        continue yesOrNo6;
                                }
                            }
                        }
                        // 先输入员工号
                        // 先查询这个员工是否存在
                        // 如果不在,输出 员工号输入有误
                        // 如果在,先显示出原有信息,再提示输入新的名字
                        // 修改信息
                    case "4":
                        delete:while (true) {
                            System.out.print("# [!] 请输入你要删除员工的编号: ");
                            int deleteId = scanner.nextInt();

                            boolean isFoundDeleteId = false;
                            int deleteIndex=0;
                            for (int i=0; i<id.length;i++) {
                                if (id[i]==deleteId) {
                                    isFoundDeleteId = true;
                                    deleteIndex = i;
                                    inCompany[i]=false;
                                    break;
                                }
                            }
                            if (isFoundDeleteId) {
                                System.out.println("# [◎] 已经为你删除了该员工: ");
                                System.out.println("# 编号\t | 员工姓名\t | 状态");
                                String status;
                                if (inCompany[deleteIndex]) {
                                    status="在职";
                                } else {
                                    status="已离职";
                                }
                                System.out.println("# "+id[deleteIndex]+"\t|"+username[deleteIndex]+"\t\t|"+status);
                                System.out.println();

                            } else {
                                System.out.println("# [❌] 看起来你的公司并没有此编号的员工!你仍然可以继续使用删除功能!");
                            }
                            System.out.println("# [◎] 刚刚的操作已经结束!是否要继续删除?若否将返回至主菜单!");
                            System.out.print("# [!] (yes/no): ");
                            String yesNo5 = scanner.next();
                            yesOrNo5:while(true) {
                                switch (yesNo5) {
                                    case "yes":
                                        continue delete;
                                    case "no":
                                        continue start;
                                    default:
                                        System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                                        System.out.println("# [!] 是否要继续删除?若否将返回至主菜单!");
                                        System.out.print("# [!] (yes/no): ");
                                        yesNo5 = scanner.next();
                                        continue yesOrNo5;
                                }
                            }
                        }

                        // 数组删除元素
                        // int[] = 0;
                        // String [] = null;
                    case "5":
                        System.exit(0);
                    default:
                        // 是否继续?
                        System.out.println("# [❌] 你输入的有误,请重新输入你要进行的操作!");
                        System.out.print("# [!] 请选择你要进行的操作: ");
                        flag = scanner.next();
                        continue judge;
                }
            }
        }
    }

总结

做这个员工管理系统,最需要考虑的是各种可能性用户体验性
需要从代码层面考虑,这个选项都有哪些可能性,有些选择可能会报错,查询不到,抑或是查到了,要做什么事情
需要从用户层面考虑,这个系统是否实用,从人为实用的角度上来说,使用完每一个功能,是否可以继续使用功能?如果输入了错的选项,是否可以重新输入,而不是每一次死板的返回至主菜单,选择了某个子功能,是否要制作返回上一级,这些都是我们需要考虑的,不能简单、粗心、大条的考虑整个系统规模,否则程序用起来会很麻烦

比较麻烦的点
每次的选项,都要写返回至上一级或主菜单的功能,这是繁琐的
要考虑每一个输入错误的情况,然后提示重新输入

比较难的点
整个系统考验的是你的逻辑,各种index角标switch()的运用
逻辑层面要很清晰,知道要做什么,要干什么
只要足够用心、细心,“难”的点,也就不难了

最后修改:2023 年 01 月 09 日
如果觉得我的文章对你有用,请随意赞赏