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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 亦金亦水 中级黑马   /  2014-7-11 18:23  /  1241 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
* 有五格学生,每个学生有三门的课程
* 从键盘输入以上数据(包括姓名,三门课成绩)
* 输入的格式:如:zhangsan,30,40,50 计算出总成绩
* 并把学生的信息和计算出的总分数,高低顺序存放在磁盘文件“stud.txt”中
*
* 1、描述学生对象
* 2、定义一个可以操作学生对象的工具类
*
* 思想:
* 1、通过获取键盘录入的一行数据,并将该行中的信息取出,封装成学生对象。
* 2、因为学生对象有很多,那么就需要存储,使用的集合,因为要对学生的总分排序,所以可以使用treeSet
* 3、将集合中的信息写入到一个文件中
* */
import java.util.*;
import java.io.*;

public class IO_test {
        public void run() throws IOException{
                Comparator cpt = Collections.reverseOrder();//这里顶一个比较器,由于需求是从高到低的排序,正常程序使用的是自然排序方式
                //通过集合类Collections的特有方法reverseOrder(返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序)
                //返回的比较器,传参到类Student_tool的静态方法getStudent上。使得进行比较
                Set<Student> s = Student_tool.getStudent(cpt);
                Student_tool.writer(s);
        }
}
class Student_tool{
        public static Set<Student> getStudent(Comparator<Student> cpt) throws IOException{
/*1、定义工具类:实现从键盘输入数据,并且将数据放在集合TreeSet中,
* 2、通过传过来的Comparator<Student> cpt 比较器,来判断是否进行强制比较,如果cpt=null,则使用自然排序,否则使用比较器,
* 这样的好处是,在main入口处可以进行随意的选择比较情况
*
* 3、将输入的数据存到集合中,返回该集合
* */
                BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
               
                Set<Student> s = null;
                                if(cpt == null)
                                        s = new TreeSet<Student>();
                                else s = new TreeSet<Student>(cpt);
                String k = null;
                while((k = bf.readLine())!=null){
                        if("over".equals(k))
                                break;
                        String[] y = k.split(",");
                        Student stu = new Student(y[0].toString(),
                                                        Integer.parseInt(y[1]),
                                                        Integer.parseInt(y[2]),
                                                        Integer.parseInt(y[3]));
                        s.add(stu);
                }
                return s;
        }
        public static void writer(Set<Student> s) throws IOException{
        /*
         * 通过传入的集合对象,将集合中的数据通过for增强循环,使用缓冲技术高效的写到student.txt文件中
         * 刷新后,关闭流
         * */
                BufferedWriter bf = new BufferedWriter(new FileWriter("student.txt"));
                for(Student k:s){
                        bf.write(k.toString());
                        bf.newLine();
                        bf.flush();
                }
                bf.close();
        }
}

class Student implements Comparable<Student>{
        /*
         * 根据需求,封装的学生对象如下:
         * 封装的对象,有可能会进行比较等操作,那么在封装的时,养成习惯,将compareTo、hashCode、equals三个方法一定要重写,另外实现Comparable接口
         * 本例实现对姓名和sum进行自然排序
         * */
        private String name;
        private int math,china,english;
        private int sum;
        Student(String name,int math,int china,int english){
                this.name = name;
                this.math = math;
                this.china = china;
                this.english = english;
                sum = (math+china+english);
        }
       
        public String getName(){
                return name;
        }
        public int getSum(){
                return sum;
        }

        public String toString(){
                return "姓名  = "+name+",  数学  = "+math+",  语文  = "+china+",  英语  = "+english+",       总分: "+sum;

        }

        @Override
        public int compareTo(Student s) {

                int n = new Integer(this.sum).compareTo(new Integer(s.sum));

                if (n == 0)
                        return this.name.compareTo(s.name);
               
                return n;
        }
        public int hashCode(){
                System.out.println("3333");
                return this.name.hashCode()+this.sum*78;
        }
        public boolean equals(Object o){
                System.out.println("44444");
                if(!(o instanceof Student)){
                        throw new RuntimeException("程序有误!");
                }
                Student s = (Student)o;
               
                return this.name.equals(s.name)&& this.sum == s.sum;
        }
         
}

8 个回复

倒序浏览
你这个代码貌似比较繁琐,还有简便点的吗
回复 使用道具 举报
yanyoucheng520 发表于 2014-7-11 19:19
你这个代码貌似比较繁琐,还有简便点的吗

可以优化,还没优化,学习中
回复 使用道具 举报
我也刚看完这段视频
回复 使用道具 举报
刚看完这个,后续待跟进一起交流
回复 使用道具 举报
学习了。。。。
回复 使用道具 举报
飘过   学习了
回复 使用道具 举报
treeSet只要实现Comparable接口,复写compareTo方法就好了吧
回复 使用道具 举报
cheye0207 发表于 2014-7-12 15:57
treeSet只要实现Comparable接口,复写compareTo方法就好了吧

需要复写Equals 和 hashCode方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马