一、问题的描述^skip

给出问题描述和需求
开发一个员工管理系统,实现对员工信息的添加、查询、修改、删除、排序和保存等操作。员工信息包括编号、姓名、性别、出生年月、学历、职务、电话和住址等内容,并且需要能够从 CSV 文件读取员工数据并保存更新后的数据到 CSV 文件。

二、解决方案

给出问题的解决方案

  1. 添加员工:录入新员工信息,检查编号是否唯一。
  2. 查询员工:支持通过姓名、学历、职务、电话、住址和编号等字段查询员工信息。
  3. 修改员工信息:能够更新员工的所有信息字段。
  4. 删除员工:通过编号删除指定员工。
  5. 排序员工:按照员工编号对员工列表进行排序。
  6. 保存数据:将员工信息保存到 CSV 文件中。
  7. 读取数据:从 CSV 文件中读取员工信息。
  8. 用户交互:通过控制台菜单操作,实现上述所有功能。

三、程序代码

1. (一) Employee类

编号 方法/属性 作用
1 Employee 构造函数,初始化员工对象的所有属性
2 getId 获取员工编号
3 setId 设置员工编号
4 getName 获取员工姓名
5 setName 设置员工姓名
6 getGender 获取员工性别
7 setGender 设置员工性别
8 getBirthDate 获取员工出生日期
9 setBirthDate 设置员工出生日期
10 getEducation 获取员工学历
11 setEducation 设置员工学历
12 getPosition 获取员工职位
13 setPosition 设置员工职位
14 getPhone 获取员工电话
15 setPhone 设置员工电话
16 getAddress 获取员工住址
17 setAddress 设置员工住址
18 toString 生成并返回员工信息的字符串表示形式
19 isComplete 检查员工信息是否完整
20 updateDetails 更新员工的各项详细信息
import java.time.LocalDate;

public class Employee {
private int id;
private String name;
private String gender;
private LocalDate birthDate;
private String education;
private String position;
private String phone;
private String address;

/**
* 构造函数,初始化员工信息。
*
* @param id 员工编号
* @param name 员工姓名
* @param gender 员工性别
* @param birthDate 出生日期
* @param education 学历
* @param position 职位
* @param phone 电话
* @param address 住址
*/
public Employee(int id, String name, String gender, LocalDate birthDate, String education, String position, String phone, String address) {
this.id = id;
this.name = name;
this.gender = gender;
this.birthDate = birthDate;
this.education = education;
this.position = position;
this.phone = phone;
this.address = address;
}

// Getters 和 Setters 方法

/**
* 获取员工编号。
*
* @return 员工编号
*/
public int getId() {
return id;
}

/**
* 设置员工编号。
*
* @param id 员工编号
*/
public void setId(int id) {
this.id = id;
}

/**
* 获取员工姓名。
*
* @return 员工姓名
*/
public String getName() {
return name;
}

/**
* 设置员工姓名。
*
* @param name 员工姓名
*/
public void setName(String name) {
this.name = name;
}

/**
* 获取员工性别。
*
* @return 员工性别
*/
public String getGender() {
return gender;
}

/**
* 设置员工性别。
*
* @param gender 员工性别
*/
public void setGender(String gender) {
this.gender = gender;
}

/**
* 获取员工出生日期。
*
* @return 员工出生日期
*/
public LocalDate getBirthDate() {
return birthDate;
}

/**
* 设置员工出生日期。
*
* @param birthDate 员工出生日期
*/
public void setBirthDate(LocalDate birthDate) {
this.birthDate = birthDate;
}

/**
* 获取员工学历。
*
* @return 员工学历
*/
public String getEducation() {
return education;
}

/**
* 设置员工学历。
*
* @param education 员工学历
*/
public void setEducation(String education) {
this.education = education;
}

/**
* 获取员工职位。
*
* @return 员工职位
*/
public String getPosition() {
return position;
}

/**
* 设置员工职位。
*
* @param position 员工职位
*/
public void setPosition(String position) {
this.position = position;
}

/**
* 获取员工电话。
*
* @return 员工电话
*/
public String getPhone() {
return phone;
}

/**
* 设置员工电话。
*
* @param phone 员工电话
*/
public void setPhone(String phone) {
this.phone = phone;
}

/**
* 获取员工住址。
*
* @return 员工住址
*/
public String getAddress() {
return address;
}

/**
* 设置员工住址。
*
* @param address 员工住址
*/
public void setAddress(String address) {
this.address = address;
}

/**
* 生成员工信息的字符串表示形式。
*
* @return 员工信息字符串
*/
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthDate=" + birthDate +
", education='" + education + '\'' +
", position='" + position + '\'' +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}

/**
* 检查员工信息是否完整。
*
* @return 如果所有字段都不为空或为默认值,则返回 true;否则返回 false。
*/
public boolean isComplete() {
return id > 0 && name != null && !name.isBlank() &&
gender != null && !gender.isBlank() &&
birthDate != null &&
education != null && !education.isBlank() &&
position != null && !position.isBlank() &&
phone != null && !phone.isBlank() &&
address != null && !address.isBlank();
}

/**
* 更新员工信息。
*
* @param name 新姓名
* @param gender 新性别
* @param birthDate 新出生日期
* @param education 新学历
* @param position 新职位
* @param phone 新电话
* @param address 新住址
*/
public void updateDetails(String name, String gender, LocalDate birthDate, String education, String position, String phone, String address) {
if (name != null && !name.isBlank()) {
this.name = name;
}
if (gender != null && !gender.isBlank()) {
this.gender = gender;
}
if (birthDate != null) {
this.birthDate = birthDate;
}
if (education != null && !education.isBlank()) {
this.education = education;
}
if (position != null && !position.isBlank()) {
this.position = position;
}
if (phone != null && !phone.isBlank()) {
this.phone = phone;
}
if (address != null && !address.isBlank()) {
this.address = address;
}
}
}

2. (二) EmployeeManager类

编号 方法/属性 作用
1 EmployeeManager 构造函数,初始化员工管理器,创建一个空的员工列表
2 addEmployee 添加一个新员工
3 updateEmployee 更新指定ID的员工信息
4 deleteEmployee 删除指定ID的员工
5 searchEmployeesByName 按姓名关键字搜索员工
6 searchEmployeesByEducation 按学历关键字搜索员工
7 searchEmployeesByPosition 按职位关键字搜索员工
8 searchEmployeesByPhone 按电话关键字搜索员工
9 searchEmployeesByAddress 按地址关键字搜索员工
10 searchEmployeesByBirthDateRange 按出生日期范围搜索员工
11 getEmployeeById 获取指定ID的员工
12 getAllEmployees 获取所有员工列表
13 getEmployeeCount 获取员工总数
14 getEmployeesByPosition 获取指定职位的员工列表
15 sortEmployees 对员工列表进行排序
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.time.LocalDate;


public class EmployeeManager {
private List<Employee> employees;

/**
* 构造函数,初始化员工管理器。
*/
public EmployeeManager() {
this.employees = new ArrayList<>();
}

/**
* 添加一个新员工。
*
* @param employee 新员工对象
*/
public void addEmployee(Employee employee) {
employees.add(employee);
}

/**
* 更新指定ID的员工信息。
*
* @param id 员工ID
* @param updatedEmployee 更新后的员工对象
*/
public void updateEmployee(int id, Employee updatedEmployee) {
for (Employee employee : employees) {
if (employee.getId() == id) {
employee.setName(updatedEmployee.getName());
employee.setGender(updatedEmployee.getGender());
employee.setBirthDate(updatedEmployee.getBirthDate());
employee.setEducation(updatedEmployee.getEducation());
employee.setPosition(updatedEmployee.getPosition());
employee.setPhone(updatedEmployee.getPhone());
employee.setAddress(updatedEmployee.getAddress());
break;
}
}
}

/**
* 删除指定ID的员工。
*
* @param id 员工ID
*/
public void deleteEmployee(int id) {
employees.removeIf(employee -> employee.getId() == id);
}

/**
* 按姓名搜索员工。
*
* @param keyword 姓名关键字
* @return 匹配的员工列表
*/
public List<Employee> searchEmployeesByName(String keyword) {
return employees.stream()
.filter(employee -> employee.getName().contains(keyword))
.collect(Collectors.toList());
}

/**
* 按学历搜索员工。
*
* @param keyword 学历关键字
* @return 匹配的员工列表
*/
public List<Employee> searchEmployeesByEducation(String keyword) {
return employees.stream()
.filter(employee -> employee.getEducation().contains(keyword))
.collect(Collectors.toList());
}

/**
* 按职位搜索员工。
*
* @param keyword 职位关键字
* @return 匹配的员工列表
*/
public List<Employee> searchEmployeesByPosition(String keyword) {
return employees.stream()
.filter(employee -> employee.getPosition().contains(keyword))
.collect(Collectors.toList());
}

/**
* 按电话搜索员工。
*
* @param keyword 电话关键字
* @return 匹配的员工列表
*/
public List<Employee> searchEmployeesByPhone(String keyword) {
return employees.stream()
.filter(employee -> employee.getPhone().contains(keyword))
.collect(Collectors.toList());
}

/**
* 按地址搜索员工。
*
* @param keyword 地址关键字
* @return 匹配的员工列表
*/
public List<Employee> searchEmployeesByAddress(String keyword) {
return employees.stream()
.filter(employee -> employee.getAddress().contains(keyword))
.collect(Collectors.toList());
}

/**
* 获取指定ID的员工。
*
* @param id 员工ID
* @return 员工对象的Optional
*/
public Optional<Employee> getEmployeeById(int id) {
return employees.stream().filter(employee -> employee.getId() == id).findFirst();
}

/**
* 对员工列表进行排序。
*
* @param comparator 比较器
*/
public void sortEmployees(Comparator<Employee> comparator) {
employees.sort(comparator);
}

/**
* 获取所有员工列表。
*
* @return 员工列表
*/
public List<Employee> getAllEmployees() {
return employees;
}

/**
* 按出生日期范围搜索员工。
*
* @param start 开始日期
* @param end 结束日期
* @return 匹配的员工列表
*/
public List<Employee> searchEmployeesByBirthDateRange(LocalDate start, LocalDate end) {
return employees.stream()
.filter(employee -> !employee.getBirthDate().isBefore(start) && !employee.getBirthDate().isAfter(end))
.collect(Collectors.toList());
}

/**
* 获取员工总数。
*
* @return 员工总数
*/
public int getEmployeeCount() {
return employees.size();
}

/**
* 获取指定职位的员工列表。
*
* @param position 职位
* @return 匹配的员工列表
*/
public List<Employee> getEmployeesByPosition(String position) {
return employees.stream()
.filter(employee -> employee.getPosition().equalsIgnoreCase(position))
.collect(Collectors.toList());
}
}

3. (三) Main类

编号 方法/属性 作用
1 main(String[] args) 程序的入口点,初始化EmployeeManager,从CSV文件加载员工数据,并提供一个循环的命令行菜单来管理员工
2 displayMenu 显示主菜单,供用户选择操作
3 loadEmployeesFromCSV 从CSV文件加载员工数据并添加到EmployeeManager
4 saveEmployeesToCSV 将当前的员工数据保存到CSV文件
5 displayAllEmployees 显示所有员工的详细信息
6 searchEmployee 提供一个菜单,允许用户选择不同的搜索方式
7 displaySearchMenu 显示搜索菜单,供用户选择搜索方式
8 searchEmployeeByName 按姓名搜索员工
9 searchEmployeeByEducation 按学历搜索员工
10 searchEmployeeByPosition 按职位搜索员工
11 searchEmployeeByPhone 按电话搜索员工
12 searchEmployeeByAddress 按地址搜索员工
13 searchEmployeeById 按员工编号搜索员工
14 displayEmployees 格式化并显示员工信息
15 addEmployee 添加新员工
16 deleteEmployee 删除指定编号的员工
17 updateEmployee 更新指定编号的员工信息
18 displayUpdateMenu 显示更新员工信息的查询方式菜单
19 getEmployeesByOption 根据用户选择的查询方式,获取匹配的员工列表
20 updateEmployeeDetails 更新员工的详细信息
21 sortEmployees 按员工编号对员工进行排序
22 readInt 从控制台读取一个整数值,并处理无效输入
23 readDate 从控制台读取一个日期,并处理无效输入
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeParseException;
import java.util.List;
import java.util.Optional;
import java.util.Scanner;
import java.util.Comparator;

public class Main {
private static final String CSV_FILE = "employees.csv";

public static void main(String[] args) {
EmployeeManager manager = new EmployeeManager();
loadEmployeesFromCSV(manager);
Scanner scanner = new Scanner(System.in);

while (true) {
displayMenu();
int choice = readInt(scanner);

switch (choice) {
case 1 -> displayAllEmployees(manager);
case 2 -> addEmployee(manager, scanner);
case 3 -> searchEmployee(manager, scanner);
case 4 -> deleteEmployee(manager, scanner);
case 5 -> updateEmployee(manager, scanner);
case 6 -> sortEmployees(manager);
case 0 -> {
saveEmployeesToCSV(manager);
System.out.println("退出系统。");
return;
}
default -> System.out.println("无效的选择,请重新选择。");
}
}
}

private static void displayMenu() {
System.out.println("1. 显示全部记录");
System.out.println("2. 添加员工");
System.out.println("3. 查询员工");
System.out.println("4. 删除员工");
System.out.println("5. 更新员工信息");
System.out.println("6. 按编号排序");
System.out.println("0. 退出");
System.out.print("请选择您需要的功能: ");
}

private static void loadEmployeesFromCSV(EmployeeManager manager) {
try (BufferedReader reader = new BufferedReader(new FileReader(CSV_FILE))) {
String line;
reader.readLine(); // 跳过标题行
while ((line = reader.readLine()) != null) {
String[] fields = line.split(",");
int id = Integer.parseInt(fields[0]);
String name = fields[1];
String gender = fields[2];
LocalDate birthDate = LocalDate.parse(fields[3]);
String education = fields[4];
String position = fields[5];
String phone = fields[6];
String address = fields[7];
Employee employee = new Employee(id, name, gender, birthDate, education, position, phone, address);
manager.addEmployee(employee);
}
} catch (IOException e) {
System.out.println("读取CSV文件时出错: " + e.getMessage());
} catch (DateTimeParseException e) {
System.out.println("日期格式错误: " + e.getMessage());
} catch (NumberFormatException e) {
System.out.println("编号格式错误: " + e.getMessage());
} catch (Exception e) {
System.out.println("加载员工数据时出错: " + e.getMessage());
}
}

private static void saveEmployeesToCSV(EmployeeManager manager) {
try (FileWriter writer = new FileWriter(CSV_FILE)) {
writer.write("编号,姓名,性别,出生年月,学历,职务,电话,住址\n");
List<Employee> employees = manager.getAllEmployees();
for (Employee employee : employees) {
writer.write(employee.getId() + "," +
employee.getName() + "," +
employee.getGender() + "," +
employee.getBirthDate() + "," +
employee.getEducation() + "," +
employee.getPosition() + "," +
employee.getPhone() + "," +
employee.getAddress() + "\n");
}
System.out.println("员工信息已保存到CSV文件。");
} catch (IOException e) {
System.out.println("写入CSV文件时出错: " + e.getMessage());
}
}

private static void displayAllEmployees(EmployeeManager manager) {
List<Employee> employees = manager.getAllEmployees();
if (employees.isEmpty()) {
System.out.println("没有员工记录。");
} else {
displayEmployees(employees);
}
}

private static void searchEmployee(EmployeeManager manager, Scanner scanner) {
while (true) {
displaySearchMenu();

String option = scanner.nextLine().toLowerCase();

if (option.equals("0")) {
break;
}

switch (option) {
case "a" -> searchEmployeeByName(manager, scanner);
case "b" -> searchEmployeeByEducation(manager, scanner);
case "c" -> searchEmployeeByPosition(manager, scanner);
case "d" -> searchEmployeeByPhone(manager, scanner);
case "e" -> searchEmployeeByAddress(manager, scanner);
case "f" -> searchEmployeeById(manager, scanner);
default -> System.out.println("无效的选择,请重新输入。");
}
}
}

private static void displaySearchMenu() {
System.out.println("请选择查询方式:");
System.out.println("\ta. 按姓名查找");
System.out.println("\tb. 按学历查找");
System.out.println("\tc. 按职位查找");
System.out.println("\td. 按电话查找");
System.out.println("\te. 按地址查找");
System.out.println("\tf. 按员工编号查找");
System.out.println("\t0. 返回上一级菜单");
System.out.print("请输入选项: ");
}

private static void searchEmployeeByName(EmployeeManager manager, Scanner scanner) {
System.out.print("输入员工姓名: ");
String name = scanner.nextLine();
List<Employee> employees = manager.searchEmployeesByName(name);
displayEmployees(employees);
}

private static void searchEmployeeByEducation(EmployeeManager manager, Scanner scanner) {
System.out.print("输入员工学历: ");
String education = scanner.nextLine();
List<Employee> employees = manager.searchEmployeesByEducation(education);
displayEmployees(employees);
}

private static void searchEmployeeByPosition(EmployeeManager manager, Scanner scanner) {
System.out.print("输入员工职位: ");
String position = scanner.nextLine();
List<Employee> employees = manager.searchEmployeesByPosition(position);
displayEmployees(employees);
}

private static void searchEmployeeByPhone(EmployeeManager manager, Scanner scanner) {
System.out.print("输入员工电话: ");
String phone = scanner.nextLine();
List<Employee> employees = manager.searchEmployeesByPhone(phone);
displayEmployees(employees);
}

private static void searchEmployeeByAddress(EmployeeManager manager, Scanner scanner) {
System.out.print("输入员工地址: ");
String address = scanner.nextLine();
List<Employee> employees = manager.searchEmployeesByAddress(address);
displayEmployees(employees);
}

private static void searchEmployeeById(EmployeeManager manager, Scanner scanner) {
System.out.print("输入员工编号: ");
int id = readInt(scanner);
Optional<Employee> employee = manager.getEmployeeById(id);
employee.ifPresentOrElse(
System.out::println,
() -> System.out.println("没有找到编号为 " + id + " 的员工。")
);
}

private static void displayEmployees(List<Employee> employees) {
if (employees.isEmpty()) {
System.out.println("没有找到匹配的员工记录。");
} else {
String format = "| %-4s | %-10s | %-6s | %-10s | %-10s | %-10s | %-12s | %-20s |\n";
System.out.format("+------+------------+--------+------------+------------+------------+--------------+----------------------+\n");
System.out.format("| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |\n");
System.out.format("+------+------------+--------+------------+------------+------------+--------------+----------------------+\n");
for (Employee employee : employees) {
System.out.format(format, employee.getId(), employee.getName(), employee.getGender(),
employee.getBirthDate(), employee.getEducation(), employee.getPosition(),
employee.getPhone(), employee.getAddress());
}
System.out.format("+------+------------+--------+------------+------------+------------+--------------+----------------------+\n");
}
}

private static void addEmployee(EmployeeManager manager, Scanner scanner) {
try {
System.out.print("输入员工编号: ");
int id = readInt(scanner);

// 检查编号是否已存在
if (manager.getEmployeeById(id).isPresent()) {
System.out.println("编号为 " + id + " 的员工已存在,请输入其他编号。");
return;
}

System.out.print("输入员工姓名: ");
String name = scanner.nextLine();

System.out.print("输入员工性别: ");
String gender = scanner.nextLine();

System.out.print("输入员工出生年月 (yyyy-MM-dd): ");
LocalDate birthDate = readDate(scanner);

System.out.print("输入员工学历: ");
String education = scanner.nextLine();

System.out.print("输入员工职务: ");
String position = scanner.nextLine();

System.out.print("输入员工电话: ");
String phone = scanner.nextLine();

System.out.print("输入员工住址: ");
String address = scanner.nextLine();

Employee employee = new Employee(id, name, gender, birthDate, education, position, phone, address);
manager.addEmployee(employee);
System.out.println("员工添加成功。");
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println("输入错误,请重新输入。");
}
}

private static void deleteEmployee(EmployeeManager manager, Scanner scanner) {
try {
System.out.print("输入要删除的员工编号: ");
int id = readInt(scanner);

manager.deleteEmployee(id);
System.out.println("员工删除成功。");
} catch (Exception e) {
System.out.println("输入错误,请重新输入。");
}
}

private static void updateEmployee(EmployeeManager manager, Scanner scanner) {
while (true) {
displayUpdateMenu();

String option = scanner.nextLine().toLowerCase();

if (option.equals("0")) {
break;
}

List<Employee> employees = getEmployeesByOption(manager, scanner, option);

if (employees != null && !employees.isEmpty()) {
displayEmployees(employees);
System.out.print("输入要更新的员工编号: ");
int id = readInt(scanner);

Optional<Employee> employeeOpt = manager.getEmployeeById(id);
if (employeeOpt.isEmpty()) {
System.out.println("没有找到编号为 " + id + " 的员工。");
return;
}

Employee employee = employeeOpt.get();

updateEmployeeDetails(scanner, employee);
manager.updateEmployee(id, employee);
System.out.println("员工更新成功。");
return;
}
}
}

private static void displayUpdateMenu() {
System.out.println("请选择查询方式以找到需要更新的员工:");
System.out.println("\ta. 按姓名查找");
System.out.println("\tb. 按学历查找");
System.out.println("\tc. 按职位查找");
System.out.println("\td. 按电话查找");
System.out.println("\te. 按地址查找");
System.out.println("\tf. 按员工编号查找");
System.out.println("\t0. 返回上一级菜单");
System.out.print("请输入选项: ");
}

private static List<Employee> getEmployeesByOption(EmployeeManager manager, Scanner scanner, String option) {
List<Employee> employees = null;
switch (option) {
case "a" -> {
System.out.print("输入员工姓名: ");
String name = scanner.nextLine();
employees = manager.searchEmployeesByName(name);
}
case "b" -> {
System.out.print("输入员工学历: ");
String education = scanner.nextLine();
employees = manager.searchEmployeesByEducation(education);
}
case "c" -> {
System.out.print("输入员工职位: ");
String position = scanner.nextLine();
employees = manager.searchEmployeesByPosition(position);
}
case "d" -> {
System.out.print("输入员工电话: ");
String phone = scanner.nextLine();
employees = manager.searchEmployeesByPhone(phone);
}
case "e" -> {
System.out.print("输入员工地址: ");
String address = scanner.nextLine();
employees = manager.searchEmployeesByAddress(address);
}
case "f" -> {
System.out.print("输入员工编号: ");
int id = readInt(scanner);
Optional<Employee> employee = manager.getEmployeeById(id);
if (employee.isPresent()) {
employees = List.of(employee.get());
} else {
System.out.println("没有找到编号为 " + id + " 的员工。");
}
}
default -> System.out.println("无效的选择,请重新输入。");
}
return employees;
}

private static void updateEmployeeDetails(Scanner scanner, Employee employee) {
System.out.print("输入员工新姓名 (当前: " + employee.getName() + "): ");
String name = scanner.nextLine();
if (!name.isBlank()) {
employee.setName(name);
}

System.out.print("输入员工新性别 (当前: " + employee.getGender() + "): ");
String gender = scanner.nextLine();
if (!gender.isBlank()) {
employee.setGender(gender);
}

System.out.print("输入员工新出生年月 (yyyy-MM-dd) (当前: " + employee.getBirthDate() + "): ");
LocalDate birthDate = readDate(scanner);
if (birthDate != null) {
employee.setBirthDate(birthDate);
}

System.out.print("输入员工新学历 (当前: " + employee.getEducation() + "): ");
String education = scanner.nextLine();
if (!education.isBlank()) {
employee.setEducation(education);
}

System.out.print("输入员工新职务 (当前: " + employee.getPosition() + "): ");
String position = scanner.nextLine();
if (!position.isBlank()) {
employee.setPosition(position);
}

System.out.print("输入员工新电话 (当前: " + employee.getPhone() + "): ");
String phone = scanner.nextLine();
if (!phone.isBlank()) {
employee.setPhone(phone);
}

System.out.print("输入员工新住址 (当前: " + employee.getAddress() + "): ");
String address = scanner.nextLine();
if (!address.isBlank()) {
employee.setAddress(address);
}
}

private static void sortEmployees(EmployeeManager manager) {
manager.sortEmployees(Comparator.comparing(Employee::getId));
System.out.println("员工按编号排序成功。");
}

private static int readInt(Scanner scanner) {
while (!scanner.hasNextInt()) {
System.out.println("无效的输入,请输入一个数字。");
scanner.next(); // 消耗无效输入
}
int value = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
return value;
}

private static LocalDate readDate(Scanner scanner) {
while (true) {
try {
String dateString = scanner.nextLine();
return LocalDate.parse(dateString);
} catch (DateTimeParseException e) {
System.out.println("无效的日期格式,请使用 yyyy-MM-dd 格式重新输入。");
}
}
}
}

四、运行结果

给出测试运行结果

1. 添加员工:

1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 2
输入员工编号: 101
输入员工姓名: 张三
输入员工性别: 男
输入员工出生年月 (yyyy-MM-dd): 2000-01-10
输入员工学历: 本科
输入员工职务: 运维
输入员工电话: 1234567890
输入员工住址: 火星
员工添加成功。

2. 查询员工:

2.1. (1)按姓名查找

1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 3
请选择查询方式:
a. 按姓名查找
b. 按学历查找
c. 按职位查找
d. 按电话查找
e. 按地址查找
f. 按员工编号查找
0. 返回上一级菜单
请输入选项: a
输入员工姓名: 张三
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 101 | 张三 | 男 | 2000-01-10 | 本科 | 运维 | 1234567890 | 火星 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+

2.2. (2)按学历查询

请选择查询方式:
a. 按姓名查找
b. 按学历查找
c. 按职位查找
d. 按电话查找
e. 按地址查找
f. 按员工编号查找
0. 返回上一级菜单
请输入选项: b
输入员工学历: 本科
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 101 | 张三 | 男 | 2000-01-10 | 本科 | 运维 | 1234567890 | 火星 |
| 102 | 王五 | 男 | 2000-12-12 | 本科 | 开发 | 3456789012 | 月球 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+

3. 按职位、电话、地址、员工编号和上面情况类似

3.1. 3.显示全部信息

1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 1
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 101 | 张三 | 男 | 2000-01-10 | 本科 | 运维 | 1234567890 | 火星 |
| 102 | 王五 | 男 | 2000-12-12 | 本科 | 开发 | 3456789012 | 月球 |
| 103 | 李四 | 男 | 2000-11-11 | 硕士 | 经理 | 2345678901 | 地球 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+

4. 删除员工

1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 4
输入要删除的员工编号: 103
员工删除成功。
1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 1
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 101 | 张三 | 男 | 2000-01-10 | 本科 | 运维 | 1234567890 | 火星 |
| 102 | 王五 | 男 | 2000-12-12 | 本科 | 开发 | 3456789012 | 月球 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+

5. 更新员工信息

1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 5
请选择查询方式以找到需要更新的员工:
a. 按姓名查找
b. 按学历查找
c. 按职位查找
d. 按电话查找
e. 按地址查找
f. 按员工编号查找
0. 返回上一级菜单
请输入选项: a
输入员工姓名: 张三
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 101 | 张三 | 男 | 2000-01-10 | 本科 | 运维 | 1234567890 | 火星 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
输入要更新的员工编号: 101
输入员工新姓名 (当前: 张三): 张三
输入员工新性别 (当前: 男): 男
输入员工新出生年月 (yyyy-MM-dd) (当前: 2000-01-10): 2000-01-10
输入员工新学历 (当前: 本科): 硕士
输入员工新职务 (当前: 运维): 运维
输入员工新电话 (当前: 1234567890): 1234567890
输入员工新住址 (当前: 火星): 火星
员工更新成功。
1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 1
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 101 | 张三 | 男 | 2000-01-10 | 硕士 | 运维 | 1234567890 | 火星 |
| 102 | 王五 | 男 | 2000-12-12 | 本科 | 开发 | 3456789012 | 月球 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+

6. 按编号排序

1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 1
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 101 | 张三 | 男 | 2000-01-10 | 本科 | 运维 | 1234567890 | 火星 |
| 103 | 李四 | 男 | 2000-11-11 | 硕士 | 经理 | 2345678901 | 地球 |
| 102 | 王五 | 男 | 2000-12-12 | 本科 | 开发 | 3456789012 | 月球 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 6
员工按编号排序成功。
1. 显示全部记录
2. 添加员工
3. 查询员工
4. 删除员工
5. 更新员工信息
6. 按编号排序
0. 退出
请选择您需要的功能: 1
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 编号 | 姓名 | 性别 | 出生年月 | 学历 | 职务 | 电话 | 住址 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+
| 101 | 张三 | 男 | 2000-01-10 | 本科 | 运维 | 1234567890 | 火星 |
| 102 | 王五 | 男 | 2000-12-12 | 本科 | 开发 | 3456789012 | 月球 |
| 103 | 李四 | 男 | 2000-11-11 | 硕士 | 经理 | 2345678901 | 地球 |
+------+------------+--------+------------+------------+------------+--------------+----------------------+

五、总结与体会

给出课程设计的收获和体会

通过这次课程设计,我学到了以下几点:

  1. 面向对象编程思想:通过设计类和方法,将复杂的员工管理系统拆分成可管理的模块,使代码更易读、易维护。
  2. 文件操作:学习了如何读写 CSV 文件,理解了文件操作在数据持久化中的重要性。
  3. 异常处理:在文件操作和用户输入中,通过异常处理机制提高了程序的健壮性和用户体验。
  4. 用户交互:通过命令行菜单的设计,实现了用户与程序的友好交互。
  5. 数据结构和算法:通过列表和排序算法的使用,巩固了对基本数据结构和算法的理解。

这次课程设计不仅让我掌握了更多的编程技巧,还提高了我解决实际问题的能力。这些技能和经验将对我未来的学习和工作大有裨益。