第四题 说实话懵逼了
算是一个大总结吧 考到了集合 考到了io
上代码大家感受一下
- package com.itheima;
- /*
- * 有五个学生,每个学生有3门课(语文、数学、英语)的成绩,写一个程序接收从键盘输入学生的信息,
- * 输入格式为:name,30,30,30(姓名,三门课成绩),然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中。
- * 要求:stu.txt文件的格式要比较直观,打开这个文件,就可以很清楚的看到学生的信息。
- *
- */
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.Set;
- import java.util.TreeSet;
- public class Test4 {
- public static void main(String[] args) throws IOException {
- // 自定义强制反转的比较器
- Comparator<Student> cmp = Collections.reverseOrder();
- //以下把比较器作为参数传递
- Set<Student> stus = StudentInfoTool.getStudents(cmp);
- StudentInfoTool.writeToFile(stus);
- }
- }
- 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() + sum * 56;// 56是随便乘的
- }
- public boolean equals(Object obj)// 重写方法
- {
- if (!(obj instanceof Student))
- throw new ClassCastException("不是学生类!");
- Student s = (Student) obj;
- return this.name.equals(s.name) && this.sum == s.sum;
- }
- // 实现接口中的方法,分数相同再比较姓名。如果总分和姓名都相同,就是同一个人。
- 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 "姓名"+name+", 数学成绩"+ma+", 语文成绩"+cn+", 英语成绩"+en;
- }
- }
- class StudentInfoTool {
- public static Set<Student> getStudents() throws IOException// 不论带不带比较器,调用的都是带比较器的方法
- {
- return getStudents(null);// 不带比较器的比较
- }
- public static Set<Student> getStudents(Comparator<Student> cmp)
- throws IOException// 带自定义比较器的比较
- {
- BufferedReader bufr = new BufferedReader(new InputStreamReader(
- System.in));
- String line = null;
- Set<Student> stus = null;
- if (cmp == null)// 不论带不带比较器,调用的都是掉比较器的方法
- stus = new TreeSet<Student>();// treeset内部已经按默认自然排序,排好序啦!!!
- else
- stus = new TreeSet<Student>(cmp);
- while ((line = bufr.readLine()) != null) {
- if ("over".equals(line))// 输入over就结束
- break;
- 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 writeToFile(Set<Student> stus) throws IOException {
- BufferedWriter bufw = new BufferedWriter(new FileWriter("stuinfo.txt"));
- for(Student stu : stus)
- {
-
- bufw.write(stu.toString()+"\t");
- bufw.write("\t"+"总成绩"+stu.getSum());//要转换成字符串
- bufw.newLine();
- bufw.flush();
- }
- bufw.close();
- }
- }
复制代码
这道题参考大神做后做的 |