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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. /*
  2. 有五个学生,每个学生有3门课的成绩,
  3. 从键盘输入以上数据(包括姓名,三门课成绩),
  4. 输入的格式:如:zhagnsan,30,40,60计算出总成绩,
  5. 并把学生的信息和计算出的总分数高低顺序存放在磁盘文件"stud.txt"中。

  6. 1,描述学生对象。
  7. 2,定义一个可操作学生对象的工具类。

  8. 思想:
  9. 1,通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象。
  10. 2,因为学生有很多,那么就需要存储,使用到集合。因为要对学生的总分排序。
  11.         所以可以使用TreeSet。
  12. 3,将集合的信息写入到一个文件中。
  13. */

  14. import java.io.*;
  15. import java.util.*;

  16. class Student implements Comparable<Student>
  17. {
  18.         private String name;
  19.         private int ma,cn,en;
  20.         private int sum;
  21.         Student(String name,int ma,int cn,int en)
  22.         {
  23.                 this.name = name;
  24.                 this.ma = ma;
  25.                 this.cn = cn;
  26.                 this.en = en;
  27.                 sum = ma + cn + en;
  28.         }
  29.         public int compareTo(Student s)
  30.         {
  31.                 int num = new Integer(this.sum).compareTo(new Integer(s.sum));
  32.                 if(num==0)
  33.                         return this.name.compareTo(s.name);
  34.                 return num;
  35.         }
  36.         public String getName()
  37.         {
  38.                 return name;
  39.         }
  40.         public int getSum()
  41.         {
  42.                 return sum;
  43.         }
  44.         public int hashCode()
  45.         {
  46.                 return name.hashCode()+sum*78;
  47.         }
  48.         public boolean equals(Object obj)
  49.         {
  50.                 if(!(obj instanceof Student))
  51.                         throw new ClassCastException("类型不匹配");
  52.                 Student s = (Student)obj;
  53.                 return this.name.equals(s.name) && this.sum==s.sum;
  54.         }
  55.         public String toString()
  56.         {
  57.                 return "student["+name+", "+ma+", "+cn+", "+en+"]";
  58.                 /*
  59.                 此处的空格作用竟然非常大,它跟111行的制表符"\t"的共同作用,共同规范输出格式。
  60.                 但对这个空格所起的作用非常疑惑,开始默写代码时就忽略这些空格,输出格式总是对不齐,
  61.                 跟毕老师程序对照好久才发现,这的差别,当加上这些空格后,输出格式立刻工整了。
  62.                 但是不了解这是为什么,我个人感觉是跟111行的制表符共同作用吧?
  63.                 不清楚它们之间是怎样联系的。请指教一下,多谢。
  64.                 */
  65.         }
  66. }
  67. class StudentInfoTool
  68. {
  69.         public static Set<Student> getStudents()throws IOException
  70.         {
  71.                 return getStudents(null);
  72.         }

  73.         public static Set<Student> getStudents(Comparator<Student> cmp)throws IOException
  74.         {
  75.                 BufferedReader bufr =
  76.                         new BufferedReader(new InputStreamReader(System.in));
  77.                 String line = null;
  78.                 Set<Student> stus  = null;
  79.                 if(cmp==null)
  80.                         stus = new TreeSet<Student>();
  81.                 else
  82.                         stus = new TreeSet<Student>(cmp);
  83.                 while((line=bufr.readLine())!=null)
  84.                 {
  85.                         if("over".equals(line))
  86.                                 break;
  87.                         String[] info = line.split(",");

  88.                         Student stu = new Student(info[0],Integer.parseInt(info[1]),
  89.                                                                                 Integer.parseInt(info[2]),
  90.                                                                                 Integer.parseInt(info[3]));
  91.                         stus.add(stu);
  92.                 }
  93.                 bufr.close();
  94.                 return stus;
  95.         }

  96.         public static void write2File(Set<Student> stus)throws IOException
  97.         {
  98.                 BufferedWriter bufw = new BufferedWriter(new FileWriter("stuinfo.txt"));
  99.                 for(Student stu : stus)
  100.                 {
  101.                         bufw.write(stu.toString()+"\t");
  102.                         bufw.write(stu.getSum()+"");
  103.                         bufw.newLine();
  104.                         bufw.flush();
  105.                 }
  106.                 bufw.close();
  107.         }
  108. }

  109. class StudentInfoTest
  110. {
  111.         public static void main(String[] args) throws IOException
  112.         {
  113.                 Comparator<Student> cmp = Collections.reverseOrder();
  114.                 Set<Student> stus = StudentInfoTool.getStudents(cmp);

  115.                 StudentInfoTool.write2File(stus);
  116.         }
  117. }
复制代码
代码较长,请大家见谅,帮忙解决,感激不尽。

评分

参与人数 1黑马币 +30 收起 理由
杨志 + 30 赞一个!

查看全部评分

2 个回复

倒序浏览
{:soso_e136:}你居然是来问输出对齐的...
回复 使用道具 举报
本帖最后由 王渠 于 2012-8-1 11:46 编辑

不知道怎么修改你的。自己写了一个,也可以实现的。
不知道异常处理上是否还有缺陷,还是有其他问题。
  1. import java.io.BufferedWriter;
  2. import java.io.File;
  3. import java.io.FileWriter;
  4. import java.io.PrintWriter;
  5. import java.util.Scanner;

  6. public class Score {
  7.         public static void main(String[] args)throws Exception{
  8.                 File file = new File("stud.txt");
  9.                 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(
  10.                                 file)));
  11.                
  12.                 Scanner input = new Scanner(System.in);
  13.                 System.out.println("输入的格式:如:zhagnsan,30,40,60");
  14.                 for (int i = 1; i <= 5; i++) {//因为题目的要求说是5个学生。
  15.                         String scr = input.nextLine();
  16.                         try {
  17.                                 out.write(new Students(scr).toString());
  18.                         } catch (Exception e) {
  19.                                 System.out.println("输入错误,请从新输入");
  20.                                 i--;
  21.                                 continue;
  22.                         } finally {
  23.                                 out.flush();
  24.                         }
  25.                 }
  26.                 out.close();
  27.         }
  28. }

  29. class Students {//学生类并未设置getter,setter
  30.         private String name;
  31.         private int score_1;
  32.         private int score_2;
  33.         private int score_3;
  34.         private String scr;

  35.         public Students(String scr) throws Exception {
  36.                 this.scr = scr;
  37.                 String[] token = scr.split(",");
  38.                 name = token[0];
  39.                 score_1 = Integer.parseInt(token[1]);
  40.                 score_2 = Integer.parseInt(token[2]);
  41.                 score_3 = Integer.parseInt(token[3]);
  42.         }

  43.         public Students(String name, int score_1, int score_2, int score_3) {
  44.                 super();
  45.                 this.name = name;
  46.                 this.score_1 = score_1;
  47.                 this.score_2 = score_2;
  48.                 this.score_3 = score_3;
  49.         }

  50.         public String toString() {
  51.                 int sum = score_1 + score_2 + score_3;
  52.                 return "姓名:" + this.name + "\t总成绩:" + sum + "\n";
  53.         }
  54. }
复制代码

点评

呃 多谢你的热心 但是我就想知道那个空格是如何作用输出格式的。。  发表于 2012-8-1 12:33
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马