黑马程序员技术交流社区

标题: IO流代码问题_小空格大疑问 [打印本页]

作者: 郑文博    时间: 2012-7-16 20:55
标题: IO流代码问题_小空格大疑问
本帖最后由 郑文博 于 2012-7-16 20:56 编辑

  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. }
复制代码
代码有点长,请将就看吧,问题不大,帮忙解决,感激不尽。

作者: 何旭栋    时间: 2012-7-16 22:00
对齐跟空格没有关系,跟Student.toString()得到的字符串长度有关系,
如果两个字符串长度相差小于8,最后总分是对齐的,楼主可以在stuinfo.txt里的字符串多按几个空格试试
作者: 郑文博    时间: 2012-7-16 23:12
何旭栋 发表于 2012-7-16 22:00
对齐跟空格没有关系,跟Student.toString()得到的字符串长度有关系,
如果两个字符串长度相差小于8,最后总 ...

你好 能再说具体一点吗。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2