职工信息管理系统
1.任务描述
编写一个职工类(Employee),包含的属性有职工号、姓名、性别、年龄等,将所有职工存储在一个数组中,编写职工信息管理程序实现如下操作:
(1) 增加一个职工;
(2) 根据职工号删除某位职工;
(3) 根据职工号修改职工的某些信息;
(4) 将所有职工年龄增加一岁;
(5) 将数组中顺序显示所有职工信息;
(6) 将所有职工按姓名排序输出。
备注:
(1) 编写三个类:职工类、职工操作类和测试类。
(2) 职工信息管理系统类的UML图如下所示。
2.运行结果
增:
插入成功:
删:
删成功:
指定改:
指定改成功:
所有年龄+1:
3.实现思路
设计函数完成增,删,改,排序功能.
-
增思路:
依题要求,首先判断输入的职工号是否为“000”:若输入结果不为“000”时需要利用构造方法ergodic()判断该输入的职工号是否存在,存在则重新输入,直至输入不存在链表中的职工号,后依此输入其他信息;然后利用类方法将输入的各个参数传入类中;最后利用链表的常用方法add(E e)方法增加结点到链表中。若输入的职工号为“000”则退出录入功能。 -
删思路:
利用构造方法ergodic()判断输入的职工号是否存在。若存在则返回该职工对应结点的位置并用链表的常用方法remove(int index)将该节点删除;若不存在则输出错误提示。 -
改思路:
a. 指定职工号修改:利用构造方法ergodic()判断输入信息是否存在。若存在则返回该职工对应结点的位置并用链表的常用方法get(int index)和构造的setNameString(String)修改信息;若不存在则输出错误信息。
b. 全部修改:首先设置迭代器iterator遍历链表,利用hasNext()方法判断链表结点是否为空;然后创建Employee对象利用迭代器的next()方法获取每一个结点;最后利用Employee类中构造的setAgestring()和getAgestring()方法使所有结点的年龄信息+1。 -
排序思路:
首先为了不改变原链表的信息,创建一个链表利用链表的常用方法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+左键查看各个方法的源代码以便理解各个方法的原理。