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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.itheima;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Test1 {
        public static void main(String[] args) throws IOException {
                /**
                 * 1、有五个学生,每个学生有3门课(语文、数学、英语)的成绩,写一个程序接收从键盘输入学生的信息,
                 * 输入格式为:name,30,30,30(姓名,三门课成绩),然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中。
                 * 要求:stu.txt文件的格式要比较直观,打开这个文件,就可以很清楚的看到学生的信息。
                 */
               
                /*思路:
                 * 定义学生类Student,并实现Comparable接口,用于学生的比较;复写hashCode 和 equals方法,用于将学生对象存入双列集合的键值比较
                 *
                 * 定义双列集合:存入学生对象,在遍历的过程中写入到指定的文件夹中
                 */
                Comparator<Student> com = Collections.reverseOrder();//自定义一个比较器
/*                static <T> Comparator<T>
                 reverseOrder()
                          返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。*/
                File fi = new File("E:\\stu.txt");//指定存储的目录
               
                Set<Student> se = StudentIn(com,false);
               
                ToFile(se,fi);
               
        }
        //对于集合进行遍历,获取对象元素.并输出到指定文件.
        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.getSum()+"\t"+"\r\n");//加入制表符和回车
                }
                fw.close();
        }
        //定义键盘录入学生信息的方法,存入集合中
        //并传入比较器以及排序需求.如果是true,就是默认排序,否则就是自定义的排序
        public static Set<Student> StudentIn(Comparator<Student> com,boolean bo){
                Scanner scan = 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 = scan.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 sum;
        //创建带参的构造方法,其中总成绩是求和得来的
        public Student(String name, Double ch, Double ma, Double en) {
                this.name = name;
                this.ch = ch;
                this.ma = ma;
                this.en = en;
                this.sum = ch+ma+en;
        }
        //通过实现Comparable接口,复写compareTo方法,比较各个学生的总成绩,如果成绩相同,则根据姓名排序
        public int compareTo(Student stu){
//                int i = new Double(this.sum).compareTo(new Double(stu.sum));==========================原文是这么写的,我使用下方代码,替换
                int compareTo = this.sum.compareTo(stu.sum);
                if(compareTo==0)
                        return this.name.compareTo(stu.name);
                return compareTo;
        }
        //复写hashCode() 和 equals() 方法,来对各个学生对象进行去重
        public int hashCode(){
                return (int)(this.name.hashCode()+this.sum*66);
        }
        public boolean equals(Student stu){
                return this.name.equals(stu.name)&&this.sum==stu.sum;
        }
        //对外提供访问属性的set() 和 get() 方法  注意:总分是计算得来的,只对外提供get() 方法
        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 getSum(){
                return sum;
        }
        //复写toString() 方法
        @Override
        public String toString() {
                return "Student [name=" + name + ", ch=" + ch + ", ma=" + ma + ", en="
                                + en  + "]";
        }
       
       
       
       
       
       
       
       
       
       
}

0 个回复

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