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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陌路行者 中级黑马   /  2013-7-11 18:44  /  1039 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-13 15:22 编辑

import java.io.*;
import java.util.*;
class Student implements Comparable<Student>
{
        private String name;
        private String sex;
        private int java,c_shar,php;
        private int sum;
        private int avg;
        Student(String name,String sex,int java,int c_shar,int php)
        {
                this.name = name;
                this.sex = sex;
                this.java = java;
                this.c_shar = c_shar;
                this.php = php;
        }
        public int compareTo(Student s)
        {
                int num = new Integer(this.sum).compareTo(new Integer(s.sum));
                if(num==0)
                        this.name.equals(s.name);
                return num;
        }
        public int getSum()
        {
                return sum = java+c_shar+php;
        }
        public int getAvg()
        {
                return sum/3;
        }
        public boolean equalse(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");
                Student s = (Student)obj;
                return this.name.equals(s.name) && this.sum==s.sum;
        }
        public int hashCode()
        {
                return name.hashCode()+sum*78;
        }
        public String toString()
        {
                return name+"\t"+sex+"\t"+java+"\t"+c_shar+"\t"+php;
        }
  
}
class StudentInfoToos
{
        public static Set<Student> getStudnetInfo()throws IOException
        {
                BufferedReader bufr =
                        new BufferedReader(new InputStreamReader(System.in));
    System.out.println("请输入学生基本信息");
                String line = null;
                Set<Student> stus = new TreeSet<Student>();
                while((line=bufr.readLine())!=null)
                {
                        if("over".equals(line))
                                break;
        String[] info = line.split(",");
        Student stu = new Student(info[0],info[1]
         ,Integer.parseInt(info[2])
         ,Integer.parseInt(info[3])
         ,Integer.parseInt(info[4]));
        stus.add(stu);
                }
                bufr.close();
                return stus;
        }
        public static void write2File(Set<Student> stus)throws IOException
        {
                BufferedWriter bufw = new BufferedWriter(new FileWriter("Info.txt"));
    String msg = "姓名"+"\t"+"性别"+"\t"+"Java"+"\t"+"C#"+"\t"+"Php"+"\t"+"总分"+"\t"+"平均分";
      bufw.write(msg);
      bufw.newLine();
      bufw.flush();
                for(Student stu : stus)
                {
      
                        bufw.write(stu.toString()+"\t");
                        bufw.write(stu.getSum()+""+"\t");
                        bufw.write(stu.getAvg()+"");
                        bufw.newLine();
                        bufw.flush();               
                }
                bufw.close();
        }
}
class StudentInfo
{
        public static void main(String[] args)throws IOException
        {
                Set<Student> stus = StudentInfoToos.getStudnetInfo();
                StudentInfoToos.write2File(stus);
        }
}

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 董延京 于 2013-7-12 10:06 编辑

你用了TreeSet来存储排序,那么判断学生是否是同一个的标准取决于,你在Student 类中实现Comparable接口中对compareTo方法的实现,
public int compareTo(Student s)
        {
                int num = new Integer(this.sum).compareTo(new Integer(s.sum));
                if(num==0)
                        this.name.equals(s.name);
                return num;
        }

你这个写法没有任何意义,你初始化一个学生,他的sum默认值都是0,所以导致你所有的所有学生都被判断成了相等。
其实就是你取错了sum,sum应该是一个计算值。
所以应该改成

compareTo(Student s)
        {
                int num = new Integer(this.getSum()).compareTo(new Integer(s.getSum());
                if(num==0)
                        num = this.name.equals(s.name);//这个位置也有错误,如果num为0,那么比较名字,那么num应该被赋值成为名字的比较结果。
                return num;
        }

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
董延京 发表于 2013-7-12 10:04
你用了TreeSet来存储排序,那么判断学生是否是同一个的标准取决于,你在Student 类中实现Comparable接口中 ...

名字和名字比,返回的是布尔型的
回复 使用道具 举报
陌路行者 发表于 2013-7-12 10:21
名字和名字比,返回的是布尔型的

嗯,是的,那你也用compareTo就行了,这个地方是我回复完又发现的,所以就手动加的。不好意思,没太注意
num = this.name.compareTo(s.name);
回复 使用道具 举报
本帖最后由 下雨天 于 2013-7-12 16:52 编辑

这个问题应该已经解决了吧  我试了好几次找到了问题所在  但是我不太明白
public int compareTo(Student s)
         {
                 int num = new Integer(this.sum).compareTo(new Integer(s.sum));
                 if(num==0)
                         this.name.equals(s.name);
                 return num;
         }
为什么this.name.equals(s.name)这句话会导致这样的问题的产生 如果录入的信息是不重复的  这句话应该是不会执行到的 到底是什么原因导致只能录入一个学生的信息呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马