本程序使用了ArrayList,HashMap,io流的序列化等知识。
package kgc.cn.sys;
import java.io.*;
import java.util.*;
/**
* 1.首先需要读取已经注册的学生信息存储在Map集合中,方便后面注册时校验学生的学号是否已经被注册
* 2.填写注册信息,校验学生序号是否已被注册,如果没有被注册,则将学生信息添加到Map集合中
* 3.学生选课:选课时需要先校验课程是否已经被选了
* 注意:序列化的时候需要注意所有的对象都必须实现序列化接口,JDK版本不能发生变化,否则反序列化将抛出异常
*/
public class Starter {
private static Scanner sc =new Scanner(System.in);
private static Map<String, Student> studentMap = new HashMap<>();
private static final String STUDENT_PATH = "E:/student/stu.ser";
private static final Course[] COURSES = {
new Course("1", "Java"),
new Course("2", "Html"),
new Course("3", "Css"),
new Course("4", "Js"),
new Course("5", "数据库"),
new Course("6", "JSP"),
new Course("7", "Spring"),
new Course("8", "Mybatis"),
};
private static String CURRENT_STUDENT_NUMBER = null;
public static void main(String[] args) {
readStudentFromFile();
showLoginMenu();
}
private static void readStudentFromFile(){
File file = new File(STUDENT_PATH);
if(file.exists()){
try(InputStream is = new FileInputStream(STUDENT_PATH);
ObjectInputStream ois = new ObjectInputStream(is);){
studentMap = (Map<String, Student>) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void showLoginMenu(){
System.out.println("1.登录");
System.out.println("2.注册");
System.out.println("3.退出");
System.out.println("请选择菜单编号:");
int number = sc.nextInt();
if(number == 1){
gotoLogin();
} else if(number == 2){
gotoRegister();
} else {
saveStudents();
System.out.println("感谢使用");
}
}
private static void saveStudents() {
File parent = new File(STUDENT_PATH).getParentFile();
if(!parent.exists())
parent.mkdirs();
try (OutputStream os = new FileOutputStream(STUDENT_PATH);
ObjectOutputStream oos = new ObjectOutputStream(os);){
oos.writeObject(studentMap);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void gotoLogin(){
System.out.println("请输入学号:");
String number = sc.next();
System.out.println("请输入姓名:");
String name = sc.next();
if(studentMap.containsKey(number)){
Student student = studentMap.get(number);
if(name.equals(student.getName())){
CURRENT_STUDENT_NUMBER = number;
gotoChooseCourse();
} else {
System.err.println("学号或者姓名不匹配,请重新登录");
gotoLogin();
}
} else {
System.err.println("学号不存在,请先注册");
showLoginMenu();
}
}
private static void gotoRegister(){
System.out.println("请输入学号:");
String number = sc.next();
System.out.println("请输入姓名:");
String name = sc.next();
if(studentMap.containsKey(number)){
System.err.println("该学号已被注册");
showLoginMenu();
} else {
studentMap.put(number, new Student(number, name));
System.out.println("注册成功,是否前往登录?(Y/N)");
String s = sc.next();
if("Y".equalsIgnoreCase(s)){
gotoLogin();
} else {
showLoginMenu();
}
}
}
private static void gotoChooseCourse(){
for(Course c: COURSES){
c.show();
}
System.out.println("请选择课程编号:");
int number = sc.nextInt();
Course c = COURSES[number-1];
Student stu = studentMap.get(CURRENT_STUDENT_NUMBER);
boolean success = stu.addCourse(c);
if(success){
System.out.println("选课成功,是否继续选课?(Y/N)");
System.out.println("当前所选课程信息:");
stu.showCourses();
String s = sc.next();
if("Y".equalsIgnoreCase(s)){
gotoChooseCourse();
} else {
showLoginMenu();
}
} else {
System.err.println("请勿重复选课");
gotoChooseCourse();
}
}
}
package kgc.cn.sys;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Student implements Serializable {
private String number;
private String name;
private List<Course> courses = new ArrayList<>();
public Student(String number, String name) {
this.number = number;
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 返回值:true:添加成功,false:重复添加
* @param c
* @return
*/
public boolean addCourse(Course c){
boolean exists = false;
for(Course course: courses){
if(course.getNumber().equals(c.getNumber())){
exists = true;
break;
}
}
if(!exists){
courses.add(c);
return true;
}
return false;
}
public void removeCourse(Course c){
// for(Iterator<Course> iter=courses.iterator();iter.hasNext();){
// Course course = iter.next();
// if(course.getNumber().equals(c.getNumber())){
// iter.remove();
// break;
// }
// }
for(int i=courses.size()-1;i>=0; i--){
Course course = courses.get(i);
if(course.getNumber().equals(c.getNumber())){
courses.remove(i);
break;
}
}
}
public void showCourses(){
for(Course course: courses){
course.show();
}
}
}
package kgc.cn.sys;
import java.io.Serializable;
public class Course implements Serializable {
private String number;
private String name;
private int score;
public Course(String number, String name) {
this.number = number;
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public void show(){
System.out.println(number + "." + name);
}
}