java写学生日常管理_Java:写了个学生管理系统,以备期末之需

packagetest;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

import java.util.Scanner;

import java.util.Set;

import java.util.TreeSet;

public class StudentManageSystem {

/** StudentManager中提供的操作菜单 **/

public static void showMenus() {

String format = "              %s\n";

System.out.println("----------------功能菜单------------------");

System.out.printf(format, "0. 退出管理");

System.out.printf(format, "1. 功能菜单");

System.out.printf(format, "2. 显示学生");

System.out.printf(format, "3. 查询学生");

System.out.printf(format, "4. 添加学生");

System.out.printf(format, "5. 删除学生");

System.out.printf(format, "6. 修改学生");

System.out.printf(format, "7. 读取学生");

System.out.printf(format, "8. 保存学生");

System.out.println("-------------------结束------------------");

System.out.println();

}

/** 管理学生信息 **/

public void manageStudents() throws IOException {

Scanner scanner = new Scanner(System.in);

StudentDao sd = new StudentDao();

StudentService ss = new StudentService(sd, scanner);

showMenus();

int op = -1;

while (op != 0) {

System.in.skip(System.in.available());

System.out.print("输入菜单编号: ");

op = scanner.nextInt();

scanner.nextLine(); // 吃掉输入菜单编号后无效的回车字符

try {

switch (op) {

case 0:

break;

case 1:

showMenus();

break;

case 2:

ss.showStudents();

break;

case 3:

ss.findStudents();

break;

case 4:

ss.addStudent();

break;

case 5:

ss.removeStudent();

break;

case 6:

ss.updateStudent();

break;

case 7:

ss.readStudents();

break;

case 8:

ss.saveStudents();

break;

default:

System.out.println("没有提供此项操作\n");

}

} catch (Exception e) {

System.out.println("\t" + e.getMessage() + "\n");

}

}

}

public static void main(String[] args) throws IOException {

StudentManageSystem sm = new StudentManageSystem();

sm.manageStudents();

System.out.println("程序结束");

}

}

/** Service中的很多功能都是委托给Dao对象去完成 **/

class StudentService {

private StudentDao studentDao;

private Scanner scanner;

public StudentService(StudentDao studentDao, Scanner scanner) {

this.studentDao = studentDao;

this.scanner = scanner;

}

// 添加学生

public void addStudent() {

System.out.print("输入学生资料进行添加,格式为id|name|age: ");// name|age

String info = scanner.nextLine();

Student s = Student.buildStudent(info);

if (studentDao.hasStudent(s)) { throw new RuntimeException("此学生信息已经存在"); }

studentDao.addStudent(s);

System.out.println("\t添加成功\n");

}

// 删除学生

public void removeStudent() {

System.out.print("输入学生id进行删除: ");

int id = scanner.nextInt();

Student s = studentDao.findStudent(id);

if (s == null) {

System.out.println("\t查无此学生");

} else {

studentDao.removeStudent(s);

System.out.println("\t已经删除学生: " + s);

}

System.out.println();

}

/** 修改学生信息 **/

public void updateStudent() {

System.out.print("修改学生信息,输入学生id: ");

int id = scanner.nextInt();

Student s = studentDao.findStudent(id);

if (s == null) {

System.out.println("\t查无此学生");

} else {

scanner.nextLine(); // 吃掉回车

System.out.println("\t学生: " + s);

System.out.print("\t输入新的信息,格式为name|age: ");

String line = scanner.nextLine().trim();

if (!line.matches("\\w+\\|\\d+")) {

throw new RuntimeException("输入的修改学生信息格式不对");

}

// 修改已搜索到的学生信息

String[] infos = line.split("\\|");

String name = infos[0];

int age = Integer.parseInt(infos[1]);

s.setName(name);

s.setAge(age);

System.out.println("\t修改完成");

}

System.out.println();

}

/** 输入学生的学号或者姓名进行查找 **/

public void findStudents() {

System.out.print("输入学生ID或者姓名进行查询: ");

String info = scanner.nextLine().trim();

List ss = new ArrayList();

// 如果输入的是数字,默认为学号

if (info.matches("\\d+")) {

int id = Integer.parseInt(info);

Student s = studentDao.findStudent(id);

if (s != null) {

ss.add(s);

}

} else {

ss = studentDao.findStudents(info);

}

// 输出查询结果

if (ss.size() == 0) {

System.out.println("查无此学生");

} else {

for (Student s : ss) {

System.out.println("\t" + s);

}

}

System.out.println();

}

/** 显示已经有的学生信息 **/

public void showStudents() {

Set students = studentDao.getStudents();

if (students.size() == 0) {

System.out.println("\t列表中还没有任何学生");

return;

}

System.out.println("========所有学生信息========");

for (Student s : students) {

System.out.println("\t" + s);

}

System.out.println();

}

public void saveStudents() {

studentDao.saveStudents();

System.out.println("\t保存成功");

}

public void readStudents() {

studentDao.readStudents();

System.out.println("\t读取完成");

}

}

/** 对学生数据进行执久化操作 **/

class StudentDao {

private Set students;

private String fileName = "students.dat";

public StudentDao() {

students = new TreeSet(new StudentComparator());

}

/** 添加学生 **/

public void addStudent(Student student) {

students.add(student);

}

/** 删除学生 **/

public void removeStudent(Student student) {

students.remove(student);

}

/** 使用学生的id进行查找 **/

public Student findStudent(int id) {

for (Student s : students) {

if (s.getId() == id) { return s; }

}

return null;

}

/** 使用学生的名字查找进行查找 **/

public List findStudents(String name) {

List found = new ArrayList();

for (Student s : students) {

if (s.getName().equals(name)) {

found.add(s);

}

}

return found;

}

/** 判断学生是否已经存在 **/

public boolean hasStudent(Student s) {

return students.contains(s);

}

/** 返回学生列表的视图,不可修改 **/

public Set getStudents() {

return Collections.unmodifiableSet(students);

}

/** 把学生信息保存到文件 **/

public void saveStudents() {

ObjectOutputStream oos = null;

try {

oos = new ObjectOutputStream(new FileOutputStream(fileName));

oos.writeObject(students);

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException("保存失败");

} finally {

if (oos != null) {

try {

oos.close();

} catch (Exception e2) {

}

}

}

}

/** 从文件读取学生信息 **/

public void readStudents() {

ObjectInputStream ois = null;

try {

ois = new ObjectInputStream(new FileInputStream(fileName));

students = (Set) ois.readObject();

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException("读取失败");

} finally {

if (ois != null) {

try {

ois.close();

} catch (Exception e2) {

}

}

}

}

}

/** 学生类,可以序列化保存到文件 **/

class Student implements Serializable {

privatestaticfinallongserialVersionUID= 1L;

privateintid;

privateintage;

private String name;

public Student() {

}

public Student(int id, String name, int age) {

this.id = id;

this.age = age;

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

// Info format: id|name|age

public static Student buildStudent(String studentInfo) {

if (!studentInfo.matches("\\d+\\|\\w+\\|\\d+")) { throw new RuntimeException(

"The student information's format should be \"id|name|age\" without quote"); }

String[] infos = studentInfo.split("\\|");

int id = Integer.parseInt(infos[0]);

String name = infos[1].trim();

int age = Integer.parseInt(infos[2]);

return new Student(id, name, age);

}

@Override

public int hashCode() {

return id;

}

@Override

public boolean equals(Object obj) {

if (obj == null || obj.getClass() != this.getClass()) { return false; }

Student other = (Student) obj;

if (other.id == this.id) { return true; }

return false;

}

@Override

public String toString() {

return String.format("ID:%d, Name:%s, Age:%d", id, name, age);

}

}

// 使用TreeSet时需要的比较器

class StudentComparator implements Comparator, Serializable {

privatestaticfinallongserialVersionUID= 1L;

@Override

public int compare(Student s1, Student s2) {

return s1.getId() - s2.getId();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值