职工信息管理系统(ArrayList泛型、JAVA——基于控制台)

职工信息管理系统

1.任务描述
编写一个职工类(Employee),包含的属性有职工号、姓名、性别、年龄等,将所有职工存储在一个数组中,编写职工信息管理程序实现如下操作:
(1) 增加一个职工;
(2) 根据职工号删除某位职工;
(3) 根据职工号修改职工的某些信息;
(4) 将所有职工年龄增加一岁;
(5) 将数组中顺序显示所有职工信息;
(6) 将所有职工按姓名排序输出。
在这里插入图片描述
备注:
(1) 编写三个类:职工类、职工操作类和测试类。
(2) 职工信息管理系统类的UML图如下所示。
在这里插入图片描述2.运行结果
增:
在这里插入图片描述
插入成功:
在这里插入图片描述
删:
在这里插入图片描述
删成功:
在这里插入图片描述
指定改:
在这里插入图片描述
指定改成功:
在这里插入图片描述
所有年龄+1:
在这里插入图片描述
在这里插入图片描述
3.实现思路
设计函数完成增,删,改,排序功能.

  1. 增思路:
    依题要求,首先判断输入的职工号是否为“000”:若输入结果不为“000”时需要利用构造方法ergodic()判断该输入的职工号是否存在,存在则重新输入,直至输入不存在链表中的职工号,后依此输入其他信息;然后利用类方法将输入的各个参数传入类中;最后利用链表的常用方法add(E e)方法增加结点到链表中。若输入的职工号为“000”则退出录入功能。

  2. 删思路:
    利用构造方法ergodic()判断输入的职工号是否存在。若存在则返回该职工对应结点的位置并用链表的常用方法remove(int index)将该节点删除;若不存在则输出错误提示。

  3. 改思路:
    a. 指定职工号修改:利用构造方法ergodic()判断输入信息是否存在。若存在则返回该职工对应结点的位置并用链表的常用方法get(int index)和构造的setNameString(String)修改信息;若不存在则输出错误信息。
    b. 全部修改:首先设置迭代器iterator遍历链表,利用hasNext()方法判断链表结点是否为空;然后创建Employee对象利用迭代器的next()方法获取每一个结点;最后利用Employee类中构造的setAgestring()和getAgestring()方法使所有结点的年龄信息+1。

  4. 排序思路:
    首先为了不改变原链表的信息,创建一个链表利用链表的常用方法clone(),“克隆”一个链表。然后重写Comparable类中的compareTo()方法。最后利用链表的常用方法sort()将链表中的数据按指定内容排序。

4.实现代码

Test.java

package example;

import dao.EmployeeDAO;

public class EmployTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		EmployeeDAO employeeDAO = new EmployeeDAO();
		while (true) {
			employeeDAO.menu();
		}
	}
}

Employee.java

package javabean;

public class Employee implements Comparable {
	protected String noString;
	protected String nameString;
	protected String sexString;
	protected int age;

	public String getNoString() {
		return noString;
	}

	public void setNoString(String noString) {
		this.noString = noString;
	}

	public String getNameString() {
		return nameString;
	}

	public void setNameString(String nameString) {
		this.nameString = nameString;
	}

	public String getSexString() {
		return sexString;
	}

	public void setSexString(String sexString) {
		this.sexString = sexString;
	}

	public int getAgeString() {
		return age;
	}

	public void setAgeString(int age) {
		this.age = age;
	}

	public Employee(String no, String name, String sex, int age) {
		noString = no;
		nameString = name;
		sexString = sex;
		this.age = age;
	}

	public Employee() {

	}

	@Override
	public int compareTo(Object o) {
		Employee employee = (Employee) o;
		return this.nameString.compareTo(employee.nameString);
	}
}

EmployeeDAO.JAVA

package dao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Scanner;

import javabean.Employee;

public class EmployeeDAO {
	ArrayList<Employee> arrayList = new ArrayList<Employee>();

//设置初值
	public EmployeeDAO() {
		Employee employee1 = new Employee("001", "Sharon", "男", 28);
		Employee employee2 = new Employee("002", "Apple", "女", 29);
		Employee employee3 = new Employee("003", "Jack", "女", 21);
		arrayList.add(employee1);
		arrayList.add(employee2);
		arrayList.add(employee3);
	}

//菜单
	public void menu() {
		System.out.println("********职工信息管理系统***********");
		System.out.println("1.录入\t2.删除\t 3.修改\t 4.输出");
		System.out.println("******************************");
		System.out.print("请选择:");
		Scanner scanner = new Scanner(System.in);
		int i = scanner.nextInt();
		switch (i) {
		case 1:
			insert();
			break;
		case 2:
			delete();
			break;
		case 3:
			update();
			break;
		case 4:
			output();
			break;
		default:
			break;
		}
	}

//增
	public void insert() {
		Scanner scanner = new Scanner(System.in);
		System.out.print("职工号:");
		String noString = scanner.next();
		while (!noString.equals("000")) {
			while (ergodic(noString) != -1) {
				System.out.println("该职工存在");
				System.out.print("职工号:");
				noString = scanner.next();
			}
			if (noString.equals("000")) {
				break;
			}
			System.out.print("姓名:");
			String nameString = scanner.next();
			System.out.print("性别:");
			String sexString = scanner.next();
			System.out.print("年龄:");
			int age = scanner.nextInt();
			Employee element = new Employee(noString, nameString, sexString, age);
			arrayList.add(element);
			System.out.print("职工号:");
			noString = scanner.next();
		}
	}

//删
	public void delete() {
		System.out.print("请输入要删除的职工号:");
		Scanner scanner = new Scanner(System.in);
		String noString = scanner.next();
		if (ergodic(noString) != -1) {
			System.out.println("删除成功");
			arrayList.remove(ergodic(noString));
		} else {
			System.out.println("该职工不存在!");
		}
	}

//改
	public void update() {
		Scanner scanner = new Scanner(System.in);
		System.out.println("******修改******");
		System.out.println("1.指定\t2.全部");
		System.out.println("***************");
		System.out.print("请选择:");
		int key = scanner.nextInt();
		switch (key) {
		case 1:
			System.out.print("请输入要修改职工号:");
			String noString = scanner.next();
			if (ergodic(noString) != -1) {
				System.out.print("姓名:");
				String nameString = scanner.next();
				arrayList.get(ergodic(noString)).setNameString(nameString);
				System.out.println("修改成功");
			} else {
				System.out.println("不存在");
			}
			break;
		case 2:
			Iterator<Employee> iterator = arrayList.iterator();
			iterator = arrayList.iterator();
			while (iterator.hasNext()) {
				Employee employee = iterator.next();
				employee.setAgeString(employee.getAgeString() + 1);
			}
			break;
		default:
			break;
		}
	}

//输出以及排序
	@SuppressWarnings("unchecked")
	public void output() {
		System.out.println("*****输出******");
		System.out.println("1.原数组\t2.排序");
		System.out.println("**************");
		Scanner scanner = new Scanner(System.in);
		System.out.print("请选择:");
		int key = scanner.nextInt();
		Iterator<Employee> iterator = arrayList.iterator();
		System.out.println("***************************");
		System.out.println("职工号\t姓名\t性别\t年龄");
		System.out.println("***************************");
		switch (key) {
		case 1:
			iterator = arrayList.iterator();
			while (iterator.hasNext()) {
				Employee employee = iterator.next();
				System.out.println(employee.getNoString() + "\t" + employee.getNameString() + "\t"
						+ employee.getSexString() + "\t" + employee.getAgeString());

			}
			break;
		case 2:
			ArrayList<Employee> arrayList1 = (ArrayList<Employee>) arrayList.clone();
			Collections.sort(arrayList1);
			iterator = arrayList1.iterator();
			while (iterator.hasNext()) {
				Employee employee = iterator.next();
				System.out.println(employee.getNoString() + "\t" + employee.getNameString() + "\t"
						+ employee.getSexString() + "\t" + employee.getAgeString());
			}
			break;
		default:
			break;
		}

	}

//迭代器的方法遍历链表以及返回位置
	public int ergodic(String noString) {
		int i = 0;
		Iterator<Employee> iterator = arrayList.iterator();
		while (iterator.hasNext()) {
			if (iterator.next().getNoString().equals(noString)) {
				return i;
			}
			i++;
		}
		return -1;
	}
}

总结或感悟
错误总结:

  • 1.在功能4(输出)无法实现排序输出;
  • 2.在功能4(输出)的排序输出后改变原链表结点的顺序;

错误解决:

  • 1.通过在ComparebleTimSo()类中观察链表的sort()排序方法利用了该类中另一个countRunAndMakeAscending(),而该方法利用了接口Comparable()中的compareTo()方法,重写该方法即可使sort()方法排序泛型数据;
  • 2.创建一个空链表,利用链表的常用方法clone()将原链表“克隆”一份至空链表中,此方法不会影响原来链表; 感悟:

编程中遇到的问题以及优化:

  • 1.在开始编写增、删、改均遍历链表判断职工号是否存在,大量代码重复,所以编写ergodic()方法返回存在结点在链表中位置;
  • 2.虽然本程序数据少,但在学习迭代器并体会到它的优势后,将原来使用arrylist.get()方法改成利用迭代器的方法。

由于上学期做过的实验4与本次实验比较类似,两次实验最大的区别所用的方法不同,上次实验利用对象数组完成增删改查,本次实验利用Java中的链表以及链表的各个方法完成对链表结点的增删改查,显然在利用链表的方法较对象数组简单。
在排序中花费了大量的时间,原因是忘记了过去的接口知识以及如何重写compareTo()方法,在重写的过程中学习到利用Ctrl+左键查看各个方法的源代码以便理解各个方法的原理。

发布了5 篇原创文章 · 获赞 6 · 访问量 31

猜你喜欢

转载自blog.csdn.net/weixin_44781355/article/details/105458675