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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.itheima;
  2. import java.io.BufferedWriter;
  3. /**
  4. * 10、声明类Student,包含3个成员变量:name、age、score,
  5. * 创建5个对象装入TreeSet,按照成绩排序输出结果(考虑成绩相同的问题)。
  6. */
  7. import java.util.*;
  8. import java.io.*;

  9. public class Test10
  10. {       
  11.         public static void main(String[] args)
  12.         {        //指定反相比较器,获取学生集合。
  13.                 Set<Student1> ts = StudentTool.getStudents(Collections.reverseOrder());
  14.                 //将排序好的学生打印到控制台。
  15.                 StudentTool.printStu(ts);
  16.         /*        int s=0;
  17.                 s++;
  18.                 System.out.println(s);定义一个局部变量s,打印,为什么这段代码不运行?而主函数其他语句正常执行,单单是这段代码不运行,
  19. 注:程序是我之前写的,后来练习用eclipse调试变量加了这段代码,发现问题。*/
  20.         }
  21.        
  22. }

  23. //描述学生
  24. class Student1 implements Comparable<Student1>//因为需要对学生对象进行比较。所以实现Comparable接口
  25. {
  26.         private String name ;
  27.         private int age ;
  28.         private double score ;
  29.         Student1(String name,int age,double score)
  30.         {
  31.                 this.name=name;
  32.                 this.age=age;
  33.                 this.score=score;
  34.         }
  35.         public int compareTo(Student1 s)
  36.         {
  37.                 int num = new Double(this.score).compareTo(new Double(s.score));//因为score是double型。需要强转
  38.                 if(num==0)
  39.                         return this.name.compareTo(s.name);//当score相同时,进一步比较姓名
  40.                 return num;
  41.         }
  42.         public int hashCode()//因为有可能把学生装到hashset中,所以要覆盖hashcode和equals方法
  43.         {
  44.                 return name.hashCode()+(int)score*100;
  45.         }
  46.        
  47.         public boolean equals(Object obj)
  48.        
  49.         {
  50.                 if(!(obj instanceof Student1))
  51.                         throw new ClassCastException("类型不匹配");
  52.                 Student1 s = (Student1)obj;

  53.                 return this.name.equals(s.name) && this.score==s.score;
  54.         }
  55.         public void setName(String name)
  56.         {
  57.                 this.name =name;
  58.         }
  59.         public String getName()
  60.         {
  61.                 return name;
  62.         }
  63.         public void setAge(int age)
  64.         {
  65.                 this.age =age;
  66.         }
  67.         public int getAge()
  68.         {
  69.                 return age;
  70.         }
  71.         public void setScore(double score)
  72.         {
  73.                 this.score =score;
  74.         }
  75.         public double getScore()
  76.         {
  77.                 return score;
  78.         }
  79.        
  80.         public String toString()//覆盖tostring方法。便于观看
  81.         {
  82.                 return name+"......."+score;
  83.                
  84.         }
  85. }
  86. class StudentTool//定义工具类
  87. {
  88.         public static Set<Student1> getStudents(Comparator<Student1> cmp)//定义获取学生集合的方法
  89.         {
  90.                 TreeSet<Student1> ts=null;
  91.                 if (cmp==null)//如果指定比较器为空。则按照自然排序
  92.                         ts = new TreeSet<Student1>();
  93.                 else
  94.                         ts = new TreeSet<Student1>(cmp);
  95.                 ts.add(new Student1("zhangfei",50,80));
  96.                 ts.add(new Student1("zhaoyun",33,99));
  97.                 ts.add(new Student1("guanyu",55,9999));
  98.                 ts.add(new Student1("liubei",23,60));
  99.                 ts.add(new Student1("liubei",23,60));

  100.                 return ts;
  101.         }
  102.         public static void printStu(Set<Student1> ts)//打印排序好的学生
  103.         {
  104.                 BufferedWriter bw = null;
  105.                 try //io流的基本异常处理方式
  106.                 {
  107.                                 bw = new BufferedWriter(new OutputStreamWriter(System.out));//利用转换流将内存数据输出至控制台
  108.                                 for(Student1 stu : ts)//高级for循环。遍历集合
  109.                                 {
  110.                                         bw.write(stu.toString());
  111.                                         bw.newLine();
  112.                                         bw.flush();
  113.                                 }
  114.                 }
  115.                 catch(IOException e)
  116.                 {
  117.                         throw new RuntimeException("打印失败");
  118.                 }
  119.                
  120.                 finally//关闭流资源
  121.                 {
  122.                         try
  123.                         {
  124.                                 if(bw!=null)
  125.                                 bw.close();
  126.                         }
  127.                         catch(IOException ioe)
  128.                         {
  129.                                 System.out.println("关闭流失败");
  130.                         }
  131.                        
  132.                                
  133.                                
  134.                 }
  135.         }

  136. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马