黑马程序员-JAVA基础-练习之存储学生信息

时间:2021-12-05 21:14:38

------- android培训java培训、期待与您交流!-------

  题目:有一批学生,每个学生有3门课程,从键盘上输入以下数(姓名,三门成绩)输入格式:如zhangsan,30,40,60计算出总成绩。并把学生的信息和计算出的总分数高低顺序存放到磁盘文件中。

  思路:

  1、创建一个描述学生信息的类:Student类,包含如下属性:姓名(name)、三门成绩(A、B、C) 和总成绩(sum);

  2、建立学生工具类:StudentTool 。其中的方法主要是从键盘上录入学生信息studentInfo() 和 将学生信息写入到磁盘文件中的方法writeToFile() 。

  3、因为学生数量较多,而且还要把学生的信息按分数的高低排序,则选择Set集合中的TreeSet集合。 

  通过理清思路,可以得到如下代码:

  学生类:

  思路:1、定义学生属性:姓名、三门成绩、总成绩。

     2、因为用TreeSet集合存储,则要实现Comparable接口来完成自然排序以及保证元素的唯一性(详情见:黑马程序员-JAVA基础-Java 集合之Set 接口

)。   3、重写compareTo方法、hashCode方法、equals方法,以及为了方便输出重写toString() 方法。

 1 public class Student implements Comparable{
 2     private String name ; 
 3     private int a , b , c ; 
 4     private int sum ;
 5     public Student(String name , int a , int b ,int c) {
 6         this.name = name ; 
 7         this.a = a ;
 8         this.b = b ; 
 9         this.c = c ;
10     }
11 //    get和set方法。
12     public String getName() {
13         return name;
14     }
15     public void setName(String name) {
16         this.name = name;
17     }
18     public int getA() {
19         return a;
20     }
21     public void setA(int a) {
22         this.a = a;
23     }
24     public int getB() {
25         return b;
26     }
27     public void setB(int b) {
28         this.b = b;
29     }
30     public int getC() {
31         return c;
32     }
33     public void setC(int c) {
34         this.c = c;
35     } 
36     public int getSum() {
37         return sum;
38     }
39     public void setSum(int sum) {
40         this.sum = sum;
41     }
42 //   覆写compareTo方法
43     public int compareTo(Object o) { 
44         if ( !(o instanceof Student))
45             throw new RuntimeException("匹配错误") ;
46         Student stu = (Student) o ; 
47 //        按照学生的名字排序
48         return this.name.compareTo(stu.getName());
49     }
50 //    重写hashCode方法
51     public int hashCode() {
52         return this.name.hashCode() * 87 + sum ; 
53     }
54 //    重写equals方法
55     public boolean equals(Object o) {
56         if ( !(o instanceof Student))
57             throw new RuntimeException("匹配错误") ;
58         Student stu = (Student) o ; 
59         if(this.name.equals(stu.getName())&&this.a == stu.getA()&&this.c == stu.getC())
60             if (this.sum == this.getSum())
61                 return true ;
62         return false ;
63     }
64     public String toString() {
65         return "Stuent["+this.name+","+this.a+","+this.b+","+this.c+"]" ;
66     }
67 }

  学生工具类:

  思路:1、建立学生录入方法和学生信息存入磁盘的方法。

     2、学生录入方法:通过重载,一个实现自定义比较器,一个则按自然排序。 

 1 public class StudentTool {
 2 //    建立一个学生读入方法,按自然顺序排序。
 3     public Set<Student> studentInfo() throws IOException {
 4         return studentInfo(null);
 5     }
 6 //    建立一个学生读入方法,支持自定义比较器
 7     public Set<Student> studentInfo(Comparator comp) throws IOException {
 8         
 9 //        判断比较器是否为空。
10         TreeSet<Student> StudentSet = null ;
11         if ( comp == null)   
12             StudentSet = new TreeSet<Student>( ) ;
13         else
14             StudentSet = new TreeSet<Student>(comp) ;
15 //        建立键盘录入方法
16         BufferedReader br = 
17              new BufferedReader(new InputStreamReader(System.in)) ; 
18         
19         String line = null ; 
20         while ((line = br.readLine()) != null) {
21 //            判断是否停止录入
22             if ("over".equals(line))
23                 break;
24             String[] info = line.split(",") ;  
25 //            创建学生对象
26             Student stu = new Student(info[0] , new Integer(info[1]).intValue()
27                     ,new Integer(info[2]).intValue(),new Integer(info[3]).intValue());
28             stu.setSum(stu.getA()+stu.getB() +stu.getC()) ;
29 //            加入TreeSet集合。
30             StudentSet.add(stu) ; 
31         }
32         br.close() ;
33         return StudentSet ; 
34     }
35 //    将学生信息写入文件:
36     public void writeToFile(Set<Student> studentSet)throws IOException {
37         BufferedWriter bufw = 
38             new BufferedWriter(new FileWriter("D:\\StudentInfo.txt")) ;
39         for(Student stu : studentSet) {
40             bufw.write(stu.toString()+"\t") ;
41             bufw.write(stu.getSum() + "") ;
42             bufw.newLine(); 
43         }
44         bufw.close() ;
45     }
46 }

  主函数:

 1 public class StudentDemo {
 2     public static void main(String[] args) throws IOException {
 3 //        创建一个集合对象,用于装学生类。
 4         Set<Student> stuSet = new TreeSet() ; 
 5 //        创建学生工具类对象。
 6         StudentTool stuTool = new StudentTool() ; 
 7 //        录入学生,按成绩的高低排序。
 8 //        stuSet = stuTool.studentInfo(new Comparator() { 
 9 //            public int compare(Object o1, Object o2) { 
10 //                Student stu1 = (Student) o1 ; 
11 //                Student stu2 = (Student) o2 ; 
12 //                if (stu1.getSum() == stu2.getSum())
13 //                    return stu1.getName().compareTo(stu2.getName());
14 //                return stu2.getSum() - stu1.getSum() ;
15 //                
16 //            }
17 //        }) ; 
18         stuSet = stuTool.studentInfo() ;
19 //        将学生信息写入文档。
20         stuTool.writeToFile(stuSet) ; 
21     }
22 }