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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 北冥有鱼 中级黑马   /  2014-3-10 17:38  /  1352 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 北冥有鱼 于 2014-3-10 17:41 编辑
  1. /*
  2. * 从键盘录入学生数据,包含姓名,语数外,然后根据总分由高到低排序输出到文件内
  3. */
  4. package com.itheima;

  5. import java.io.BufferedReader;
  6. import java.io.BufferedWriter;
  7. import java.io.File;
  8. import java.io.FileWriter;
  9. import java.io.IOException;
  10. import java.io.InputStreamReader;
  11. import java.util.TreeSet;


  12. class SchoolDemo {

  13.         public static void main(String[] args) throws IOException{
  14.                 TreeSet<Student> ts=new TreeSet<Student>();
  15.                 BufferedReader bufr=null;
  16.                 BufferedWriter bufw=null;
  17.                 File file=new File("D:\\myclass\\5.txt");
  18.                
  19.                 bufr=new BufferedReader(new InputStreamReader(System.in));
  20.                 bufw=new BufferedWriter(new FileWriter(file));
  21.                 String line=null;
  22.                 while ((line=bufr.readLine())!=null) {    //读取一行,以“,”切割,传递给student对象
  23.                         if (line=="over")
  24.                                 break;
  25.                         String[] arr=line.split(",");
  26.                         //System.out.println(arr[0]+"  "+arr[1]+"  "+arr[3]);
  27.                    <font color="#fffacd">   <span style="background-color: blue;">  Student s=new Student(arr[0],Integer.parseInt(arr[1]),
  28.                                         Integer.parseInt(arr[2]),Integer.parseInt(arr[3]));</span></font>
  29.                         ts.add(s);//把student添加到集合
  30.                 }
  31.                 for (Student s1 : ts) {  //遍历集合,写入输出流
  32.                         bufw.write(s1.toString());
  33.                         bufw.newLine();
  34.                 }
  35.                 bufr.close();
  36.                 bufw.close();
  37.         }

  38. }

  39. //student类,定义一个具有比较性的类,覆写了方法hashcode(),equals(),compareTo()
  40. class Student implements Comparable<Student>
  41. {
  42.         private String name;
  43.         private int ma,cn,en,sum;
  44.         Student(String name,int ma,int cn,int en)
  45.         {
  46.                 this.name=name;
  47.                 this.ma=ma;
  48.                 this.cn=cn;
  49.                 this.en=en;
  50.                 sum=ma+cn+en;
  51.         }
  52.         void setName(String name)
  53.         {
  54.                 this.name=name;
  55.         }
  56.         String getName()
  57.         {
  58.                 return name;
  59.         }
  60.         
  61.         //此处省略其他各科成绩的set ,get 方法
  62.         
  63.         public int hashcode()
  64.         {
  65.                 return name.hashCode()+sum*100;
  66.         }
  67.         public boolean equals(Object obj)
  68.         {
  69.                 if (!(obj instanceof Student)) {
  70.                         throw new ClassCastException("类型不匹配");
  71.                 }
  72.                 Student s=(Student)obj;
  73.                 return this.name.equals(s.name);
  74.         }
  75.         public int compareTo(Student s)
  76.         {
  77.                 int num=new Integer(this.sum).compareTo(new Integer(s.sum));
  78.                 if (num!=0) {
  79.                         return num;
  80.                 }
  81.                 return this.name.compareTo(s.name);
  82.         }
  83.         public String toString()
  84.         {
  85.                 return "Stuednt:"+" "+name+","+ma+","+cn+","+en+'\t'+sum;
  86.         }
  87. }
复制代码

运行  输入学生信息  如:lisi,23,23,33   总是报错,切割数组后new student()里面角标越界

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

2 个回复

倒序浏览
老师的代码有时可以直接用,但是写的时候要注意啊,不能照搬的:
已经修改的地方:
1,判断字符串相等不能用=,要用equals;
               if (line.equals("over"))
                       break;

2,按总分从高到低排序时你的 compareTo函数写的不对;
public int compareTo(Student s)
{
                int num=new Integer(s.sum).compareTo(new Integer(this.sum));
                if (num!=0)
                        return num;
                return this.name.compareTo(s.name);
}


修改后可以运行的代码:
  1. /*
  2. * 从键盘录入学生数据,包含姓名,语数外,然后根据总分由高到低排序输出到文件内
  3. */
  4. import java.io.*;
  5. import java.util.*;
  6. class SchoolDemo
  7. {
  8.         public static void main(String[] args) throws IOException
  9.         {
  10.                 TreeSet<Student> ts=new TreeSet<Student>();
  11.                 BufferedReader bufr=null;
  12.                 BufferedWriter bufw=null;
  13.                 File file=new File("D:\\myclass\\5.txt");
  14.                
  15.                 bufr=new BufferedReader(new InputStreamReader(System.in));
  16.                 bufw=new BufferedWriter(new FileWriter(file));
  17.                 String line=null;
  18.                 while ((line=bufr.readLine())!=null) //读取一行,以“,”切割,传递给student对象
  19.                 {   
  20.                         if (line.equals("over"))
  21.                                 break;
  22.                         String[] arr=line.split(",");
  23.                         Student s=new Student(arr[0],Integer.parseInt(arr[1]),Integer.parseInt(arr[2]),Integer.parseInt(arr[3]));
  24.                         ts.add(s);//把student添加到集合
  25.                  }
  26.                 for (Student s1 : ts)  //遍历集合,写入输出流
  27.                 {
  28.                         bufw.write(s1.toString());
  29.                         bufw.newLine();
  30.                 }
  31.                 bufr.close();
  32.                 bufw.close();
  33.         }
  34. }

  35. //student类,定义一个具有比较性的类,覆写了方法hashcode(),equals(),compareTo()
  36. class Student implements Comparable<Student>
  37. {
  38.         private String name;
  39.         private int ma,cn,en,sum;
  40.         Student(String name,int ma,int cn,int en)
  41.         {
  42.                 this.name=name;
  43.                 this.ma=ma;
  44.                 this.cn=cn;
  45.                 this.en=en;
  46.                 sum=ma+cn+en;
  47.         }
  48.         void setName(String name)
  49.         {
  50.                 this.name=name;
  51.         }
  52.         String getName()
  53.         {
  54.                 return name;
  55.         }
  56.        
  57.         //此处省略其他各科成绩的set ,get 方法
  58.        
  59.         public int hashcode()
  60.         {
  61.                 return name.hashCode()+sum*100;
  62.         }
  63.         public boolean equals(Object obj)
  64.         {
  65.                 if (!(obj instanceof Student))
  66.                         throw new ClassCastException("类型不匹配");
  67.                 Student s=(Student)obj;
  68.                 return this.name.equals(s.name);
  69.         }
  70.         public int compareTo(Student s)
  71.         {
  72.                 int num=new Integer(s.sum).compareTo(new Integer(this.sum));
  73.                 if (num!=0)
  74.                         return num;
  75.                 return this.name.compareTo(s.name);
  76.         }
  77.         public String toString()
  78.         {
  79.                 return "Stuednt:"+" "+name+","+ma+","+cn+","+en+'\t'+sum;
  80.         }
  81. }
复制代码
程序运行结果:
输入:
01,45,56,67
02,33,44,55
03,77,88,99
04,1,2,3
05,21,22,23
over

输出:
Stuednt: 03,77,88,99        264
Stuednt: 01,45,56,67        168
Stuednt: 02,33,44,55        132
Stuednt: 05,21,22,23        66
Stuednt: 04,1,2,3        6



评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
syw02014 发表于 2014-3-10 19:47
老师的代码有时可以直接用,但是写的时候要注意啊,不能照搬的:
已经修改的地方:
1,判断字符串相等不能 ...

嗯,确实是line.equals("over")的问题。。。之前总是提示我角标越界,怎么测试都没看出来
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马