这个程序主要是练习IO(文件读写,序列化),集合框架的使用

学生端可以实现,查找课程,增加选课,删除选课的功能

管理端可以实现对备选课程,学生信息的增删查改

缺点:登陆操作没有实现密码验证和多态。           

          另外map对象明明put了,可是get的时候竟然会取到null,而且尝试多次,有时候成功,有时候取到null,并不确定。据说这是由多线程引起的map取值为null,因为多线程部分还没开始学习,所以也没做修改。

//课程信息
package selectCourse;

import java.io.Serializable;

public class Course implements Serializable{
	private String id;
	private String name;

	public Course(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public Course() {
		super();
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Course other = (Course) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	public String toString() {
		return "课程号:" + id + " " + "课程名:" + name;
	}

}
//学生信息
package selectCourse;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Student implements Serializable,Comparable<Student>{

	private int id;
	private String name;
	private Set<Course> courses;

	public Student(int id, String name) {
		super();
		this.id = id;
		this.name = name;
		this.courses = new HashSet<Course>();
	}

	public Student() {
		super();
		this.id = 0;
		this.name = null;
		this.courses = new HashSet<Course>();
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Course> getCourses() {
		return courses;
	}

	public void setCourses(Set<Course> courses) {
		this.courses = courses;
	}

	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		return result;
	}

	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (id != other.id)
			return false;
		return true;
	}

	
	public String toString() {
		return "学号:"+id+" " +"姓名:"+name;
	}
	//遍历输出所选课程
	public void travese()
	{
		if(courses.size()>0)
		{
		for (Course course : courses) {
			System.out.println(course);
		}
		}
		else
		{
			System.out.println("还没有选课");
		}
	}

	public int compareTo(Student s) {
		
	   int result=this.id-s.id;
	   return result;
	}
	
	
}
//管理端
package selectCourse;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class AdministratorOp {
//管理端,用来管理学生信息和备选课程	
	List<Student> students = new ArrayList<Student>();
	Map<Integer, Student> map1 = new HashMap<Integer, Student>();
	List<Course> courses = new ArrayList<Course>();
	Map<String, Course> map2 = new HashMap<String, Course>();
	Scanner in = new Scanner(System.in);

	public AdministratorOp() {
	}

//~~~~~~~~~~~~~~~~~从文件读入List~~~~~~~~~~~~~~~~~~~~~
	public void load1() {
		File file = new File("students.txt");
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		FileInputStream fis;
		try {
			fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			students = (List<Student>) ois.readObject();
			ois.close();
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}

	public void load2() {
		File file = new File("courses.txt");
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		FileInputStream fis;
		try {
			fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			courses = (List<Course>) ois.readObject();
			ois.close();
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}

//将信息写回文件
	public void save1() {
		File file = new File("students.txt");
		FileOutputStream fos;
		try {
			fos = new FileOutputStream(file);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(students);
			oos.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

	}

	public void save2() {
		File file = new File("courses.txt");
		FileOutputStream fos;
		try {
			fos = new FileOutputStream(file);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(courses);
			oos.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

	}

//~~~~~~~~~~~~~~~~~~~~~~~~~ 根据List来创建Map~~~~~~~~~~~~~~~~~~~~~~~
	public void createMap1() {
		for (int i = 0; i < students.size(); i++) {
			map1.put(students.get(i).getId(), students.get(i));
		}
	}

	public void createMap2() {
		for (int i = 0; i < courses.size(); i++) {
			map2.put(courses.get(i).getId(), courses.get(i));
		}
	}

	// ~~~~~~~~~~~~~~~~~~~~~~ 增删查改~~~~~~~~~~~~~~~~~~~~~~~
	// 增加学生基本信息
	public void add() {
		System.out.println("输入学生信息,输入0结束");
		while (true) {
			int id = in.nextInt();
			if(id!=0) {
			String name = in.next();
			Student s = new Student(id, name);
			students.add(s);
			Collections.sort(students);
			map1.put(id, s);
			System.out.println("添加成功");
			}
			if (id == 0) {
				break;
			}
		}
	}

	// 删除学生信息
	public void del() {
		while(true) {
			int id = in.nextInt();
			Student s = map1.get(id);
			students.remove(s);
			map1.remove(id);
			System.out.println("移除成功");
			if (id == 0) {
				break;
			}
		}
	}
	// 增加课程基本信息
	public void add2() {
		System.out.println("输入课程信息,输入end结束");
		while (true) {	
			String id = in.nextLine();
			if(!id.equals("end"))
			{
			String name = in.nextLine();
			Course cr = new Course(id, name);
			courses.add(cr);
			map2.put(id, cr);
			System.out.println("添加成功");
			}
			else{
				//System.out.println("添加结束");
				break;
			}
		}
	}

	// 删除课程信息
	public void del2() {
		while(true) {
			String id = in.next();
			if(!id.equals("end")) {
			Course cr = map2.get(id);
			courses.remove(cr);
			map2.remove(id);
			System.out.println("移除成功");
			}
			else
			{
				break;
			}
		}
	}

	// 根据学号查找学生
	public void query1() {
		System.out.println("请输入要查询的学生学号:");
		if (in.hasNext()) {
			int id = in.nextInt();
			System.out.println(map1.get(id));
			map1.get(id).travese();
		}
	}

	// 根据课程号查找课程
	public void query2() {
		System.out.println("请输入要查询的课程号:");
		if (in.hasNext()) {
			String id = in.nextLine();
			System.out.println(map2.get(id));
		}
	}

	// 修改学生基本信息
	public void modify1() {
		System.out.println("请输入要修改的学生的学号:");
		int id = in.nextInt();
		Student s = map1.get(id);
		System.out.println("输入修改后的学生信息:");
		int no = in.nextInt();
		String name = in.next();
		int i = students.indexOf(s);
		students.set(i, new Student(no, name));
		Collections.sort(students);
		map1.remove(id);
		map1.put(no, new Student(no, name));
		System.out.println("修改成功");
	}

	// 修改课程信息
	public void modify2() {
		System.out.println("请输入要修改的课程的课程号:");
		String id = in.nextLine();
		Course cr = map2.get(id);
		System.out.println("输入修改后的课程信息:");
		String no = in.nextLine();
		String name = in.nextLine();
		int i = courses.indexOf(cr);
		courses.set(i, new Course(no, name));
		map2.remove(id);
		map2.put(no, new Course(no, name));
		System.out.println("修改成功");
	}

//	~~~~~~~~~~~~~~~~~~~~~~ 遍历list~~~~~~~~~~~~~~~~~~~~~~~
	void display1() {
		System.out.println("所有的学生信息:");
		for (Student s : students) {
			System.out.println(s.toString());
			s.travese();
		}
	}

	void display2() {
		System.out.println("所有的备选课程信息:");
		for (Course course : courses) {
			System.out.println(course.toString());
		}
	}
public	void close()
{
	in.close();
}
}
//学生操作端
package selectCourse;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class StudentOp {
	Scanner in = new Scanner(System.in);
	Student st;
	List<Student> students = new ArrayList<Student>();
	List<Course> courses = new ArrayList<Course>();
	Map<String, Course> map = new HashMap<String, Course>();

	public StudentOp(int no) {
		load3(no);
		load4();

	}

	// ~~~~~~~~~~~~~~~~~从文件读入信息~~~~~~~~~~~~~~~~~~~~~
	public void load3(int n) {
		File file = new File("students.txt");
		FileInputStream fis;
		try {
			fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			students = (List<Student>) ois.readObject();
			ois.close();
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		for (int i = 0; i < students.size(); i++) {
			if (n == students.get(i).getId()) {
				st = students.get(i);
				break;
			}
		}

	}

	public void load4() {
		File file = new File("courses.txt");
		if (!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		FileInputStream fis;
		try {
			fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			courses = (List<Course>) ois.readObject();
			ois.close();
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}

// 将信息写回文件
	public void save3() {
		File file = new File("students.txt");
		FileOutputStream fos;
		try {
			fos = new FileOutputStream(file);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(students);
			oos.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

	}

	public void save4() {
		File file = new File("courses.txt");
		FileOutputStream fos;
		try {
			fos = new FileOutputStream(file);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(courses);
			oos.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

	}

//~~~~~~~~~~~~~~~~~~~~~~~~~ 根据List来创建Map~~~~~~~~~~~~~~~~~~~~~~~
	public void createMap() {
		for (int i = 0; i < courses.size(); i++) {
			map.put(courses.get(i).getId(), courses.get(i));
		}

		//遍历map
		  /*Set<String> set = map.keySet();
		Iterator<String> iterator = set.iterator();
		while (iterator.hasNext()) {
			String key = iterator.next();
			System.out.println(key + " " + map.get(key));
		}		*/
	}

//遍历显示备选课程
	public void displayAllCourse() {
		System.out.println("所有的备选课程信息:");
		for (Course course : courses) {
			System.out.println(course.toString());
		}
	}

//根据课程号查询备选课程
	public void queryCourse() {
		System.out.println("请输入要查询的课程号:");
		String str = in.next();
		System.out.println(str);
		System.out.println((map.containsKey(str) ? "yes" : "no"));
		System.out.println(map.get(str));
	}

//显示所选课程
	public void display() {
		System.out.println("所选课程:");
		st.travese();
	}

//增加所选课程
	public void addSelect() {
		System.out.println("输入所选课程的课程号,输入end结束");
		while (true) {
			String id = in.nextLine();
			if (!id.equals("end")) {
				Course cr = map.get(id);
				st.getCourses().add(cr);
				System.out.println("选课成功");
			} else {
				// System.out.println("添加结束");
				break;
			}
		}
	}

//减少所选课程
	public void deleteSelect() {
		System.out.println("要删除课程的课程号,输入end结束");
		while (true) {
			String id = in.nextLine();
			if (!id.equals("end")) {
				Course cr = map.get(id);
				st.getCourses().remove(cr);
				System.out.println("删除成功");
			} else {
				// System.out.println("添加结束");
				break;
			}
		}
	}

	public void close() {
		in.close();
	}
}
//测试类
package selectCourse;

import java.util.Scanner;

public class Test {

	public static void main(String[] args) {
//~~~~~~~~~~~~~测试管理端~~~~~~~~~~~~~~~~~~~~~~~~~~
	    /*添加学生
		AdministratorOp a1=new AdministratorOp();
		a1.add();
		//a1.display1();
		// a1.close();
		a1.save1();*/
		/*添加课程
		AdministratorOp a2=new AdministratorOp();
		a2.add2();
		//a2.display2();
		a2.close();			    
	    a2.save2();*/
/*	//	测试删除,查找,修改
	    AdministratorOp a3=new AdministratorOp();
		a3.load1();
		a3.createMap1();
		a3.load2();
		a3.createMap2();
//		a3.display1();
//		a3.display2();
//		a3.del();
//		a3.display1();
//		a3.del2();
//		a3.display2();
//		a3.query1();
//		a3.query2();
//		a3.modify1();
//		a3.display1();
//		a3.modify2();
//		a3.display2();
        a3.close();
       // a3.save1();
       // a3.save2();*/
//~~~~~~~~~~~~~~~~测试学生端~~~~~~~~~~~~~~~~~~~~~~~~~
    /*Scanner in=new Scanner(System.in);
    System.out.println("请输入学号:");
    int id=in.nextInt();
	StudentOp sto=new StudentOp(id);
	sto.createMap();
	//sto.displayAllCourse();
	//sto.queryCourse();
	
//	sto.addSelect();
//	sto.deleteSelect();
	sto.display();
	sto.close();
	in.close();
//	sto.save3();
//	sto.save4();
*/	}

}