A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.itheima;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.util.ArrayList;
  8. import java.util.Collection;
  9. import java.util.Collections;
  10. import java.util.Comparator;
  11. import java.util.List;
  12. import java.util.Set;
  13. import java.util.TreeSet;

  14. /**
  15. * 3、 有五个学生,每个学生有3门课(语文、数学、英语)的成绩,<br/>
  16. * 写一个程序接收从键盘输入学生的信息,输入格式为:name,30,30,30(姓名,三门课成绩),<br/>
  17. * 然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中。<br/>
  18. * 要求:stu.txt文件的格式要比较直观,打开这个文件,就可以很清楚的看到学生的信息。
  19. *
  20. * @author Liyixuan
  21. */
  22. /*
  23. *
  24. * 思想:
  25. * 1,通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象。
  26. * 2,因为学生有很多,那么就需要存储,使用到集合。因为要对学生的总分排序。所以可以使用TreeSet。 3,将集合的信息写入到一个文件中。
  27. *
  28. * 处理:2种方式 : list、set
  29. */
  30. public class Test3 {

  31.         /**
  32.          * 测试方法 - 线程入口
  33.          * @throws Exception
  34.          */
  35.         public static void main(String[] args) throws Exception {

  36.                 //第一种方法,使用ComparatorStudent 比较器
  37.                 List<Student> list = StudentUtils.sysInputStream(new ArrayList<Student>());
  38.                
  39.                 ComparatorStudent comparator = new ComparatorStudent("cmp");
  40.                 Collections.sort(list, Collections.reverseOrder(comparator));//反转比较器
  41.                
  42.                 StudentUtils.writeToFile(list,"stu.txt");
  43.                
  44. /*               
  45.                 //第二种方法,使用Comparator<Student> 比较器,reverseOrder()反转比较器  
  46.                 Comparator<Student> cmp = Collections.reverseOrder();
  47.         
  48.         //用学生信息工具类调用getStudents方法,因为是静态方法,可以直接调用,返回一个Set集合  
  49.         Set<Student> stus = StudentUtils.sysInputStream(new TreeSet<Student>(cmp));
  50.         
  51.         //用学生信息工具类调用writeToFile方法,因为是静态方法,可以直接调用  
  52.         StudentUtils.writeToFile(stus,"stu2.txt");  */
  53.         }

  54. }

  55. /**
  56. * 学生的工具类
  57. *
  58. * @author liyx
  59. *
  60. */
  61. class StudentUtils {
  62.         @SuppressWarnings({ "rawtypes", "unchecked" })
  63.         public static <T> T sysInputStream(T obj) throws Exception {
  64.                 System.out.println("请输入数据: (格式 name,90,90,90)");
  65.                 // 通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象。
  66.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(
  67.                                 System.in));

  68.                 String line = null; // 定义一个字符串

  69.                 Collection objColl = null;
  70.                 // Collection与object比较
  71.                 boolean isFather = Collection.class.isAssignableFrom(obj.getClass());
  72.                 if (isFather) { // "C是obj的父类"
  73.                         objColl = (Collection) obj;
  74.                 } else {
  75.                         throw new Error("参数不是Collection子类");
  76.                 }

  77.                 // 循环读

  78.                 while ((line = bufr.readLine()) != null) {
  79.                         // 如果输入over则结束
  80.                         if ("over".equals(line))
  81.                                 break;
  82.                         String[] info = line.split(",");// 用逗号把数据隔开
  83.                         // 将info封装成学生对象,将各成绩都转换成整数
  84.                         Student stu = new Student(info[0], Integer.parseInt(info[1]),
  85.                                         Integer.parseInt(info[2]), Integer.parseInt(info[3]));

  86.                         objColl.add(stu);// 将字符串数组添加到集合中
  87.                 }

  88.                 bufr.close();

  89.                 return (T) objColl;
  90.         }

  91.         public static void writeToFile(Collection<Student> students,String fileName) throws IOException {
  92.                 // 创建一个文件用来存放数据
  93.                 BufferedWriter bufw = new BufferedWriter(new FileWriter(fileName));

  94.                 for (Student stu : students) {
  95.                         bufw.write(stu.toString());// 将学生的姓名和各成绩写出去
  96.                         bufw.write(" | " + stu.getTotalPoints());// 将学生的总分写到文件

  97.                         bufw.newLine();// 换行一次
  98.                         bufw.flush();// 字符流缓冲区需要刷新
  99.                 }

  100.                 bufw.close();
  101.                 System.out.println("写入文件已成功");
  102.         }

  103. }

  104. class ComparatorStudent implements Comparator<Student> {
  105.         public ComparatorStudent(String cmp) {
  106.         }

  107.         @Override
  108.         public int compare(Student o1, Student o2) {
  109.                 // 先比总分
  110.                 int totalPoints = new Integer(o1.getTotalPoints())
  111.                                 .compareTo(new Integer(o2.getTotalPoints()));
  112.                 if (totalPoints == 0)
  113.                         return o1.getName().compareTo(o2.getName());// 如果总分相等,则比较姓名
  114.                 return totalPoints;// 如果总分不相等,则比较总分
  115.         }
  116. }

  117. class Student implements Comparable<Student> {
  118.         private String name;
  119.         private int chinese;
  120.         private int maths;
  121.         private int english;
  122.         private int totalPoints;

  123.         Student(String name, int chinese, int maths, int english) {
  124.                 this.name = name;
  125.                 this.chinese = chinese;
  126.                 this.maths = maths;
  127.                 this.english = english;
  128.                 this.totalPoints = chinese + maths + english;
  129.         }

  130.         public String getName() {
  131.                 return name;
  132.         }

  133.         public int getChinese() {
  134.                 return chinese;
  135.         }

  136.         public int getMaths() {
  137.                 return maths;
  138.         }

  139.         public int getEnglish() {
  140.                 return english;
  141.         }

  142.         public int getTotalPoints() {
  143.                 return totalPoints;
  144.         }

  145.         // 为了打印效果,有必要覆盖toString方法
  146.         public String toString() {
  147.                 return "" + name + ", " + chinese + ", " + maths + ", " + english;
  148.         }

  149.         @Override
  150.         public int compareTo(Student o) {
  151.                 //先比总分  
  152.         int totalPoints = new Integer(this.getTotalPoints()).compareTo(new Integer(o.getTotalPoints()));  
  153.         if(totalPoints==0)  
  154.             return this.name.compareTo(o.name);//如果总分相等,则比较姓名  
  155.         return totalPoints;//如果总分不相等,则比较总分  
  156.         }
  157. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

倒序浏览
你这个覆盖的toString方法好像没起作用呢
回复 使用道具 举报
学习学习~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马