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

© luck_start 中级黑马   /  2015-10-2 23:46  /  324 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

4、 有五个学生,每个学生有3门课(语文、数学、英语)的成绩,
* 写一个程序接收从键盘输入学生的信息, 输入格式为:name,30,30,30
* (姓名,三门课成绩),  然后把输入的学生信息按总分从高到低的顺序写入
* 到一个名称"stu.txt"文件中。要求:stu.txt文件的格式要比较直观,
* 打开这个文件,就可以很清楚的看到学生的信息。
*
*         思路:
*                 1.学生的信息要从键盘接受,那么怎么样能把从键盘接受的数据变成
* 一个学生的属性信息呢?接受的是一个字符串,切割行不?
*                 2.切割的字符串,变成字符串数组,由于输入的信息是有规律的,那么
* 就可以根据角标对应的学生信息进行传入.
*                 3.学生信息传给了学生对象了,那么对象要怎么做呢?学生对象,需要
* 对这些信息进行整理.那么学生需要有对于这个信息有必要的判断方法.比如是不是同一个人呢?
*                 4.一个一个的学生对象,我要怎么样整理呢?必须是集合了,集合就是来整理
* 对象的.学生对象都放集合了,还要对成绩有一个排序?那必须要集合自身的比较性才 可以完成.(学生只能自己和别人比一下,因为如果将学生作为一个对象参考的话,只知道自己和别人是不是一样的.而如果要站在学生整体上的排序,眼光就要站在一个可以统领和掌控学生的对象,也就是集合.)
*                 5.集合,遍历,再打印学生对象信息,再输入到指定文件.
*
*         总结:
*                 1.一个对象中可能存在很多属性,那么这些属性之间存在什么样的关系呢?有些属性是直接可以获取的,有些属性,是建立在其他属性的基础上才存在意义的.
*                 2.学生如何比较,实现的是Comparable接口,重写了CompareTo方法.而集合比较是通过Comparator接口,实现compare方法.也可以一个自定义比较器.而这个比较器还是要通过comparator这张脸让集合自身具备了比较性.因此,comparator可以看作是集合比较方法一个中介.
*                 3.集合自身比较性和元素自身比较性之间存在什么联系呢?好乱的感觉.我个人觉得,集合是一个更大的存在,但是这个集合要比较小小的元素,如何知道元素是排前还是排后呢?根据什么呢?就是根据元素给集合"提供的信息",元素本身做为一个对象,只知道自己和另一个元素谁大谁小,但是由于视角的局限性,让整体元素无法做出一个排序,只能把信息传递给集合,而集合可以站在一个更高的角度来说:你应该站在哪里.
* (好比a小朋友和b小朋友比较成绩,他们两个很清楚,但是他们无法做出整个班级小朋友的比较.这个时候小朋友需要把信息提供给老师,然后老师才能站在更高角度来进行审视,谁应该排在哪里....小朋友就相当于学生对象,老师就相当于集合)
*
* 思考:
*                 1.对于编程而言,尤其是java的编程思想.对象和对象之间如何产生关系.既然万物都是对象,想必然对象和对象之间也会存在视角限制.这里面存在一个层次问题,我觉得,这个层次在心里一定要清晰可见.比如我站在一个教室的角度去看对象,那么就有了桌子,空调...等等.如果我站在一个桌子的角度,那么桌子上的水杯,书本...等等才会进入我的视角.不然的话,站在一个教室的角度,去审视一个水杯,这就属于跨级审视.结果就是混乱了.
*                 2.对于每一个功能体,尽量做到独立封装.哪些是我需要控制的,就放外面,哪些是一个功能体,就封装起来.比如,我要控制存放的文件地址,那么,我就创建一个文件地址放在外面.我对排序要求控制,就需要在传入参数时候让其具备灵活性.假如这个功能是接受一个文件,返回一个字符串,那么就尽量封装起来..对于以后如果有相同需求,我们还可以调用以进行功能复用.
*                 虽然只是一些小小的程序.但是,我们有必要从开始就拥有一个较完美的编程思想.等到程序变得越来越复杂的时候,我们也可以轻而易举的掌控.
* */
public class Demo04 {
        public static void main(String[] args) throws IOException {
                Comparator<Student> com = Collections.reverseOrder(); //自定义一个比较器
                File fi = new File("c:\\stu.txt");  //指定文件目录.定义在外面更好一些,提高扩展.
                Set<Student> se = StudnetIn(com,false); //将比较器传入方法以及排序方式..返回一个集合.
                ToFile(se,fi);                    //将集合和file传入.
        }

        //对于集合进行遍历,获取对象元素.并输出到指定文件.
        public static void ToFile(Set<Student> se,File fi) throws IOException {
                Iterator<Student> it = se.iterator();
                FileWriter fw = new FileWriter(fi);
                while(it.hasNext())
                {
                        Student s = it.next();
                        fw.write(s.toString() + s.getMax() + "\t"+"\r\n");
                }
                fw.close();
        }

        //传入比较器以及排序需求.如果是true,就是默认排序,否则就是自定义的排序.
        public static Set<Student>  StudnetIn(Comparator<Student> com,boolean bo) {
                Scanner s = new Scanner(System.in);
                Set<Student> se = null;
                if(bo == true) //自然排序.
                {
                        se = new TreeSet<Student>();
                }
                else    //自定义排序(也就是定义的倒序)
                {
                        se = new TreeSet<Student>(com);
                }               
                while(true)
                {
                        String ss = s.nextLine();
                        if(ss.equals("over"))  //输入结束指令.
                        {
                                System.out.println("输入结束");
                                break;
                        }else
                        {
                                //切割,并将字符串和角标传递给student对象,并存入集合中.
                                String[] str = ss.split(",");
                                se.add(new Student(str[0],Double.parseDouble(str[1]),
                                                Double.parseDouble(str[2]),Double.parseDouble(str[3])));
                        }
                }
                return se;
        }
}

//定义一个实现Comparable的学生对象.
class Student implements Comparable<Student>
{
        private String name;
        private Double ch;
        private Double ma;
        private Double en;
        private Double max;
        Student(String name,Double ch,Double ma,Double en) //参数直接收语文,数学,英语,为什么?
        {
                this.name = name;
                this.ch = ch;
                this.ma = ma ;
                this.en = en;
                this.max = ch + ma + en; //总成绩是算出来的,不是传入的.
        }
        public int compareTo(Student stu) //重写compareTo方法.
        {
                //在这里要注意:谁是关键的?我们要比较什么?----成绩是关键的.
                int i = new Double(this.max).compareTo(new Double(stu.max));
                if(i == 0) //只有成绩相等,再去比较名字.
                        return this.name.compareTo(stu.name);
                return i;
        }
        public int hashCode() //重写hashCode方法.
        {
                return (int) (this.name.hashCode() + this.max * 66);
        }
        public boolean equals(Student stu) //重写equals方法.
        {
                return this.name.equals(stu.name) && this.max == stu.max;
        }
       
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public Double getCh() {
                return ch;
        }
        public void setCh(Double ch) {
                this.ch = ch;
        }
        public Double getMa() {
                return ma;
        }
        public void setMa(Double ma) {
                this.ma = ma;
        }
        public Double getEn() {
                return en;
        }
        public void setEn(Double en) {
                this.en = en;
        }
        public Double getMax() { //只想对外提供总成绩的get,而不提供set,为什么?
                return max;
        }
        @Override
        public String toString() {
                return "Student [name=" + name + ", ch=" + ch + ", ma=" + ma + ", en="
                                + en + "]";
        }       
}

4 个回复

倒序浏览
努力,拼搏,分享,感恩
回复 使用道具 举报
努力,拼搏,分享,感恩
回复 使用道具 举报
组长棒棒哒!
回复 使用道具 举报

文文棒棒哒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马