- package com.itheima;
 
  
- import java.io.BufferedReader;
 
 - import java.io.BufferedWriter;
 
 - import java.io.FileWriter;
 
 - import java.io.IOException;
 
 - import java.io.InputStreamReader;
 
 - import java.util.ArrayList;
 
 - import java.util.Collection;
 
 - import java.util.Collections;
 
 - import java.util.Comparator;
 
 - import java.util.List;
 
 - import java.util.Set;
 
 - import java.util.TreeSet;
 
  
- /**
 
 -  * 3、 有五个学生,每个学生有3门课(语文、数学、英语)的成绩,<br/>
 
 -  * 写一个程序接收从键盘输入学生的信息,输入格式为:name,30,30,30(姓名,三门课成绩),<br/>
 
 -  * 然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中。<br/>
 
 -  * 要求:stu.txt文件的格式要比较直观,打开这个文件,就可以很清楚的看到学生的信息。
 
 -  * 
 
 -  * @author Liyixuan
 
 -  */
 
 - /*
 
 -  * 
 
 -  * 思想: 
 
 -  * 1,通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象。
 
 -  * 2,因为学生有很多,那么就需要存储,使用到集合。因为要对学生的总分排序。所以可以使用TreeSet。 3,将集合的信息写入到一个文件中。
 
 -  * 
 
 -  * 处理:2种方式 : list、set
 
 -  */
 
 - public class Test3 {
 
  
-         /**
 
 -          * 测试方法 - 线程入口
 
 -          * @throws Exception 
 
 -          */
 
 -         public static void main(String[] args) throws Exception {
 
  
-                 //第一种方法,使用ComparatorStudent 比较器
 
 -                 List<Student> list = StudentUtils.sysInputStream(new ArrayList<Student>());
 
 -                 
 
 -                 ComparatorStudent comparator = new ComparatorStudent("cmp");
 
 -                 Collections.sort(list, Collections.reverseOrder(comparator));//反转比较器
 
 -                 
 
 -                 StudentUtils.writeToFile(list,"stu.txt");
 
 -                 
 
 - /*                
 
 -                 //第二种方法,使用Comparator<Student> 比较器,reverseOrder()反转比较器  
 
 -                 Comparator<Student> cmp = Collections.reverseOrder();
 
 -         
 
 -         //用学生信息工具类调用getStudents方法,因为是静态方法,可以直接调用,返回一个Set集合  
 
 -         Set<Student> stus = StudentUtils.sysInputStream(new TreeSet<Student>(cmp));
 
 -         
 
 -         //用学生信息工具类调用writeToFile方法,因为是静态方法,可以直接调用  
 
 -         StudentUtils.writeToFile(stus,"stu2.txt");  */
 
 -         }
 
  
- }
 
  
- /**
 
 -  * 学生的工具类
 
 -  * 
 
 -  * @author liyx
 
 -  * 
 
 -  */
 
 - class StudentUtils {
 
 -         @SuppressWarnings({ "rawtypes", "unchecked" })
 
 -         public static <T> T sysInputStream(T obj) throws Exception {
 
 -                 System.out.println("请输入数据: (格式 name,90,90,90)");
 
 -                 // 通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象。
 
 -                 BufferedReader bufr = new BufferedReader(new InputStreamReader(
 
 -                                 System.in));
 
  
-                 String line = null; // 定义一个字符串
 
  
-                 Collection objColl = null;
 
 -                 // Collection与object比较
 
 -                 boolean isFather = Collection.class.isAssignableFrom(obj.getClass());
 
 -                 if (isFather) { // "C是obj的父类"
 
 -                         objColl = (Collection) obj;
 
 -                 } else {
 
 -                         throw new Error("参数不是Collection子类");
 
 -                 }
 
  
-                 // 循环读
 
  
-                 while ((line = bufr.readLine()) != null) {
 
 -                         // 如果输入over则结束
 
 -                         if ("over".equals(line))
 
 -                                 break;
 
 -                         String[] info = line.split(",");// 用逗号把数据隔开
 
 -                         // 将info封装成学生对象,将各成绩都转换成整数
 
 -                         Student stu = new Student(info[0], Integer.parseInt(info[1]),
 
 -                                         Integer.parseInt(info[2]), Integer.parseInt(info[3]));
 
  
-                         objColl.add(stu);// 将字符串数组添加到集合中
 
 -                 }
 
  
-                 bufr.close();
 
  
-                 return (T) objColl;
 
 -         }
 
  
-         public static void writeToFile(Collection<Student> students,String fileName) throws IOException {
 
 -                 // 创建一个文件用来存放数据
 
 -                 BufferedWriter bufw = new BufferedWriter(new FileWriter(fileName));
 
  
-                 for (Student stu : students) {
 
 -                         bufw.write(stu.toString());// 将学生的姓名和各成绩写出去
 
 -                         bufw.write(" | " + stu.getTotalPoints());// 将学生的总分写到文件
 
  
-                         bufw.newLine();// 换行一次
 
 -                         bufw.flush();// 字符流缓冲区需要刷新
 
 -                 }
 
  
-                 bufw.close();
 
 -                 System.out.println("写入文件已成功");
 
 -         }
 
  
- }
 
  
- class ComparatorStudent implements Comparator<Student> {
 
 -         public ComparatorStudent(String cmp) {
 
 -         }
 
  
-         @Override
 
 -         public int compare(Student o1, Student o2) {
 
 -                 // 先比总分
 
 -                 int totalPoints = new Integer(o1.getTotalPoints())
 
 -                                 .compareTo(new Integer(o2.getTotalPoints()));
 
 -                 if (totalPoints == 0)
 
 -                         return o1.getName().compareTo(o2.getName());// 如果总分相等,则比较姓名
 
 -                 return totalPoints;// 如果总分不相等,则比较总分
 
 -         }
 
 - }
 
  
- class Student implements Comparable<Student> {
 
 -         private String name;
 
 -         private int chinese;
 
 -         private int maths;
 
 -         private int english;
 
 -         private int totalPoints;
 
  
-         Student(String name, int chinese, int maths, int english) {
 
 -                 this.name = name;
 
 -                 this.chinese = chinese;
 
 -                 this.maths = maths;
 
 -                 this.english = english;
 
 -                 this.totalPoints = chinese + maths + english;
 
 -         }
 
  
-         public String getName() {
 
 -                 return name;
 
 -         }
 
  
-         public int getChinese() {
 
 -                 return chinese;
 
 -         }
 
  
-         public int getMaths() {
 
 -                 return maths;
 
 -         }
 
  
-         public int getEnglish() {
 
 -                 return english;
 
 -         }
 
  
-         public int getTotalPoints() {
 
 -                 return totalPoints;
 
 -         }
 
  
-         // 为了打印效果,有必要覆盖toString方法
 
 -         public String toString() {
 
 -                 return "" + name + ", " + chinese + ", " + maths + ", " + english;
 
 -         }
 
  
-         @Override
 
 -         public int compareTo(Student o) {
 
 -                 //先比总分  
 
 -         int totalPoints = new Integer(this.getTotalPoints()).compareTo(new Integer(o.getTotalPoints()));  
 
 -         if(totalPoints==0)  
 
 -             return this.name.compareTo(o.name);//如果总分相等,则比较姓名  
 
 -         return totalPoints;//如果总分不相等,则比较总分  
 
 -         }
 
 - }
 
  复制代码 |