* 需求: 有个五个学生,每个学生有三门课的成绩,从键盘输入以上数据(包括
* 姓名,三门课总成绩)。并把学生的信息和计算出的总分数由高到低
* 存放在磁盘文件“stud.txt:中。
*
* 1.描述学生对象
* 2,定义一个可操作学生对象的工具类
*
* 思想:
* 1,通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象
* 2,因为学生有很多,那么就需要存储,使用到集合,因为要对学生的总分排序
* 所以可以使用TreeSet.
*
* 3,l将集合的信息写入文本
import java.io.*; import java.util.*; public class StudentTest { public static void main(String[] args) throws IOException { Comparator<Student> com = Collections.reverseOrder(); //调用获得学生属性方法 返回一个集合(这个调用的是默认比较器) Set<Student> stus = StudentInfoTool.getStudents(com); //调用写入方法 StudentInfoTool.write2File(stus); } } //学生类 //因为需要比较所以 实现 Comparable接口 class Student implements Comparable<Student> { private String name;//姓名 private int ma,cn,en;//三门成绩 private int sum;//总分 //构造方法 Student(String name, int ma, int cn, int en) { this.name = name; this.ma = ma; this.cn = cn; this.en = en; sum = ma + cn + en;//总分 } //得到姓名 public String getName() { return name; } //得到总分 public int getSum() { return sum; } //覆盖哈希表方法 public int hashCode() { return name.hashCode()*78; } //覆盖equals方法 public boolean equals(Object obj) { //如果传递过来的不是Student if(!(obj instanceof Student)) { throw new ClassCastException("类型不匹配"); } //obj 类型转强制换成Student类型 Student s = (Student)obj; //如果是同姓名总分的人 是同一个人 return this.name.equals(s.name) && this.sum == s.sum; } //实现了接口 必须实现comparTo方法 public int compareTo(Student s) { //比较总分 int num = new Integer(this.sum).compareTo(new Integer(s.sum)); if(num == 0) { return this.name.compareTo(s.name); } return num; } //返回姓名 各科成绩 public String toString() { return "student["+name+","+ma+","+cn+","+en+"]"; } } //学生工具类 class StudentInfoTool { public static Set<Student> getStudents() throws IOException { return null; } //从键盘获取集合中数据 public static Set<Student> getStudents(Comparator<Student> com) throws IOException { //读取键盘 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); //创建set集合 TreeSet集合 Set<Student> stus = null; if(com==null) { stus = new TreeSet<Student>(); } else { stus = new TreeSet<Student>(com); } //中间变量line String line = null; //需要抛出异常 进行遍历 while((line = bufr.readLine()) !=null ) { //如果是over if("over".equals(line)) { break;//结束循环读取 } //用逗号进行切割 使用split方法 String[] info = line.split(","); //把学生姓名 成绩封装成对象 Student stu = new Student(info[0],Integer.parseInt(info[1]), Integer.parseInt(info[2]), Integer.parseInt(info[3])); //将对象放入集合 stus.add(stu); } //关闭流 bufr.close(); //返回集合 return stus; } //把集合写入文件 定义数据存储位置 public static void write2File(Set<Student> stus) throws IOException { //创建写入 BufferedWriter bufw = new BufferedWriter(new FileWriter("Stuinfo.txt")); //循环写入文件 for(Student stu : stus) { //写入姓名 bufw.write(stu.toString() +" "); //写入总成绩 因为得到的是int类型 要转换成字符型 bufw.write(stu.getSum()+ ""); //换行 bufw.newLine(); //刷新缓冲区 bufw.flush(); } //写入结束关闭流 bufw.close(); } }