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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙浩迪 中级黑马   /  2012-7-9 19:22  /  1570 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sunhaodi 于 2012-7-9 20:33 编辑

class Student implements Comparable<Student>{

        @Override
        public int compareTo(Student o) {
               
                if(this.getSum()>o.getSum()){
                        
                        return 1;
                          
                }
         if(this.getSum()==o.getSum()){
                        
                            return this.name.compareTo(o.name);
                           
                }
                         return -1;
        
               

        }
        
        private String name;     //姓名
        private double chineseGrade; // 语文
        private double mathGrade;  //数学
        private double enGrade;  //英语
        private double sum; //总成绩
        public Student(String name, double chineseGrade, double mathGrade,
                        double enGrade) {
                this.name = name;
                this.chineseGrade = chineseGrade;
                this.mathGrade = mathGrade;
                this.enGrade = enGrade;
        
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public double getChineseGrade() {
                return chineseGrade;
        }
        public void setChineseGrade(double chineseGrade) {
                this.chineseGrade = chineseGrade;
        }
        public double getMathGrade() {
                return mathGrade;
        }
        public void setMathGrade(double mathGrade) {
                this.mathGrade = mathGrade;
        }
        public double getEnGrade() {
                return enGrade;
        }
        public void setEnGrade(double enGrade) {
                this.enGrade = enGrade;
        }
        public double getSum() {
                return sum;
        }
        public void setSum(double sum) {
                this.sum = sum;
        }

}
//信息处理类,输入学生信息并保存到文件E:\\stu.txt上
class InfoDeal {
        
        private TreeSet<Student> set ;
        InfoDeal(){
               
                  set = new TreeSet<Student>();
        }
public void start(){
         //从键盘上输入学生的信息
         inputInfo();
         
         //将学生信息存放在磁盘文件中
         saveInfoToFile();
         
}        

//从键盘上输入学生的信息
public void inputInfo(){
         
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         String s = null;
         String info[] = null;
         
          try {
                  //输入的格式为 "学生,语文,数学,英语"
                while((s=br.readLine())!=null){
                        if(s.equals("886")){
                                
                                break;
                        }
                        
                        info= s.split(",");        
                        
                        setStudentInfo(info[0], Double.parseDouble(info[1]),
                                        Double.parseDouble(info[2]),
                                        Double.parseDouble(info[1]));
                        
                          
                  }
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }finally{
               
                 if(br!=null){
                        
                         try {
                                br.close();
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                 }
               
        }
         
         
}
//将学生信息存放在磁盘文件"E:\\stu.txt"
public void saveInfoToFile(){
         
         BufferedWriter  bw = null;
         Iterator<Student>  it ;
         Student stud = null;
         
         try {
                 
                bw = new BufferedWriter(new FileWriter("E:\\Stud.txt"));
                it=set.iterator();
                while(it.hasNext()){
                          
                           stud=it.next();
                           //把信息保存到文件中
                           Double dd=stud.getChineseGrade();
                           Double ss=stud.getEnGrade();
                           Double cc = stud.getMathGrade();
                           stud.setSum(dd+ss+cc);
                           bw.write(stud.getName()+"——"+"总成绩:"+stud.getSum());
                           bw.newLine();
                           bw.flush();
                        
                }
               
               
               
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }finally{
               
                //关闭输入流
        if( bw!=null )
        {
               try
               {
                      bw.close();
               }
               catch( Exception e )
               {
                      e.printStackTrace();
               }
        }
        }
}


public void setStudentInfo(String name,double chineseGrade,double mathGrade,
                 double enGrade){
           set.add(new Student(name,chineseGrade,mathGrade, enGrade));
         
         
}
        
}

public class Test1 {
        public static void main(String[] args) {
               
                new InfoDeal().start();
               

        }

}

我明明实现了comparable方法,重写了排序方法,为什么键盘录入之后,在写到文件里面就不排序了?
我是按照成绩的总和进行排序的。。。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 周刚 于 2012-7-9 20:31 编辑

       出现这个错误是因为逻辑有点乱,在执行添加到集合之前,并没有对sum赋值 ,而仅仅是在写入到文件时才赋值。所以在集合中没有按规定排序,输入到
文件中自然也就没有按要求排序了。
     public int compareTo(Student o) {
                //System.out.println(this.getSum());//通过这一句打印可以看出:
                if (this.getSum() > o.getSum()) { //在存到硬盘之前并没有调用setSumm赋值,而排序是在存盘前
                                          //添加对象到Set里面时就开始排序了,但此时sum并没有赋值,都是0。
                        return 1;

                }

作如下修改:
       public double getSum() {
                return  chineseGrade+mathGrade+enGrade;
        }
完整代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.TreeSet;

class Student implements Comparable<Student> {

        private String name; // 姓名
        private double chineseGrade; // 语文
        private double mathGrade; // 数学
        private double enGrade; // 英语
        private double sum; // 总成绩

        public Student(String name, double chineseGrade, double mathGrade,
                        double enGrade) {
                this.name = name;
                this.chineseGrade = chineseGrade;
                this.mathGrade = mathGrade;
                this.enGrade = enGrade;

        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public double getChineseGrade() {
                return chineseGrade;
        }

        public void setChineseGrade(double chineseGrade) {
                this.chineseGrade = chineseGrade;
        }

        public double getMathGrade() {
                return mathGrade;
        }

        public void setMathGrade(double mathGrade) {
                this.mathGrade = mathGrade;
        }

        public double getEnGrade() {
                return enGrade;
        }

        public void setEnGrade(double enGrade) {
                this.enGrade = enGrade;
        }

        public double getSum() {
                return  chineseGrade+mathGrade+enGrade;        }

        public void setSum(double sum) {
                this.sum = sum;
        }

        @Override
        public int compareTo(Student o) {
                //System.out.println(this.getSum());//通过这一句打印可以看出:
                if (this.getSum() > o.getSum()) { //在招待存硬之前并没有调用setSumm赋值,而排序是在存盘前
                                          //添加对象到Set里面时就开始序了。
                        return 1;

                }
               
                if (this.getSum() == o.getSum()) {

                        return this.name.compareTo(o.name);

                }
                return -1;

        }
}

// 信息处理类,输入学生信息并保存到文件E:\\stu.txt上
class InfoDeal {

        private TreeSet<Student> set;

        InfoDeal() {

                set = new TreeSet<Student>();
        }

        public void start() {
                // 从键盘上输入学生的信息
                inputInfo();

                // 将学生信息存放在磁盘文件中
                saveInfoToFile();

        }

        // 从键盘上输入学生的信息
        public void inputInfo() {

                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                String s = null;
                String info[] = null;

                try {
                        // 输入的格式为 "学生,语文,数学,英语"
                        while ((s = br.readLine()) != null) {
                                if (s.equals("886")) {
                                        break;
                                }

                                info = s.split(",");

                                setStudentInfo(info[0], Double.parseDouble(info[1]),
                                                Double.parseDouble(info[2]),
                                                Double.parseDouble(info[1]));
                        }
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } finally {

                        if (br != null) {

                                try {
                                        br.close();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }

                }

        }

        // 将学生信息存放在磁盘文件"E:\\stu.txt"
        public void saveInfoToFile() {

                BufferedWriter bw = null;
                Iterator<Student> it;
                Student stud = null;

                try {

                        bw = new BufferedWriter(new FileWriter("E:\\Stud.txt"));
                        it = set.iterator();
                        while (it.hasNext()) {

                                stud = it.next();
                                // 把信息保存到文件中
                                Double dd = stud.getChineseGrade();
                                Double ss = stud.getEnGrade();
                                Double cc = stud.getMathGrade();
                                stud.setSum(dd + ss + cc);  //这里才对sum赋值,显然太晚了!!!
                                bw.write(stud.getName() + "——" + "总成绩:" + stud.getSum());
                                bw.newLine();
                                bw.flush();

                        }

                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } finally {

                        // 关闭输入流
                        if (bw != null) {
                                try {
                                        bw.close();
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }

        public void setStudentInfo(String name, double chineseGrade,
                        double mathGrade, double enGrade) {
                set.add(new Student(name, chineseGrade, mathGrade, enGrade));

        }

}

public class Test1 {
        public static void main(String[] args) {

                new InfoDeal().start();

        }

}
录入数据如下:
a,10,10,10
b,20,20,20
c,5,5,5
886
输出结果如下:
c——总成绩:15.0
a——总成绩:30.0
b——总成绩:60.0

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
周刚 发表于 2012-7-9 19:46
出现这个错误是因为逻辑有点乱,在执行添加到集合之前,并没有对sum赋值 ,而仅仅是在写入到文件时 ...

对对对, 迷糊了。。  搞定了, 谢谢哥们啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马