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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄敏 于 2012-8-15 22:26 编辑

class Student implements Comparable<Student>{
        private String name;
        private int age;
        private int score;
        public Student(String name, int age){
                this.setName(name);
                this.setAge(age);
                //this.setScore(score);
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
        public int getScore() {
                return score;
        }
        public void setScore(int score) {
                this.score = score;
        }
        
        public String toString(){
                return "姓名: " + this.name + ",年龄: " + this.age ;
        }
        
        public int hashCode(){
                return name.hashCode()+ age*13;
        }
        
        public boolean equals(Object obj){
                if (!(obj instanceof Student))
                        throw new RuntimeException();
                Student stu = (Student) obj;
                return this.name.equals(stu.name)&& this.age==stu.age && this.score==stu.score;
        }
        
        public int compareTo(Student stu){
                if (this.getScore() > stu.getScore())
                return -1;
                if(this.score== stu.score){
                        stu.getName().compareTo(this.getName());
                }
                return 1;
        }

}

class MyComparator implements Comparator<Student>{
        
        public int compare(Student o1, Student o2){

                int n = new Integer(o1.getAge()).compareTo(new Integer(o2.getAge()));
                if(n==0){
                        return new Integer(o1.getScore()).compareTo(new Integer(o2.getScore()));
                }
                return n;
        }
}

public class Test10 {

        public static void main(String[] args) {
                TreeMap<Student, Integer> mp = new TreeMap<Student, Integer>(new MyComparator());
                mp.put(new Student("张三",17), 89);
                mp.put(new Student("李四",18), 90);
                mp.put(new Student("马六",18), 97);
                mp.put(new Student("王五",17), 91);
                //第一种取出方式:keySet
                /*
                Set<Student> se = mp.keySet();
                Iterator<Student> it = se.iterator();
                while (it.hasNext()){
                        Student stu =it.next();
                        int val = mp.get(stu);
                        System.out.println(stu +",成绩: "+ val);
                }
                */

                //第二种取出方式:Map.Entry
                Set<Map.Entry<Student, Integer>> s1 = mp.entrySet();
                Iterator<Map.Entry<Student, Integer>> ti = s1.iterator();
                while(ti.hasNext()){
                        Map.Entry<Student, Integer> m1 =ti.next();
                        Student stu = m1.getKey();
                        int val= m1.getValue();
                        System.out.println(stu +",成绩: "+ val);
                }

        }
}

为什么  我比较的结果是年龄重复的就进不去了呢?  我也做过判断比较了啊 ,找了好长时间就是没找到,帮忙找出我的问题,能给出解释为什么就诶存进去

)Q6{0JJM0T9`8`]5W_E56_A.jpg (11.11 KB, 下载次数: 6)

)Q6{0JJM0T9`8`]5W_E56_A.jpg

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

6 个回复

倒序浏览
本帖最后由 Dreamer 于 2012-8-15 20:05 编辑

因为你在初始化学生的时候根本就没有初始化Score的值,而在 compareTo方法里,你在先比较完年龄后,如果年龄相等,你就返回 Score的比较值,以内你没有初始化Score,所以你的两个学生对象的Score都为0,所以你的 compareTo方法认为你传进来的两个学生是同一个对象,所以导致你的年龄相同的学生无法存进去。所以你的构造方法里,应该加上Score这个参数,在初始化学生对象的时候就应该把Score初始化,并且你的 compareTo方法里应该在比较一下学生的名字,否则就可能出现,年龄相同,分数相同,但名字不同的学生无法存入集合中了。
回复 使用道具 举报
你的分数不是通过new Student(....)的,然后你在你的
class MyComparator implements Comparator<Student>{
      
        public int compare(Student o1, Student o2){

                int n = new Integer(o1.getAge()).compareTo(new Integer(o2.getAge()));
                if(n==0){
                        return new Integer(o1.
getScore()).compareTo(new Integer(o2.getScore()));
                }

                return n;
        }
}

所以红色的地方出错了,编译是没错的
回复 使用道具 举报
本帖最后由 陈红建 于 2012-8-15 20:27 编辑
  1. class MyComparato1 implements Comparator<StudentS>{
  2.    
  3.     public int compare(StudentS o1, StudentS o2){
  4. <FONT color=red>//用年龄作为排序的主要条件?你用score作为次要条件。你在下面用Integer封装形式调用compareTo
  5. //最后返回的结果都是0 跟没比较一样</FONT>
  6.             int n = new Integer(o1.getAge()).compareTo(new Integer(o2.getAge()));
  7.             if(n==0){//<FONT color=red>在这里就不要用Co..To的方式来比较了</FONT>
  8.                     if (o1.getScore() > o2.getScore())//<FONT color=red>这里才是真的判断score的返回值.需要加个判断来判断次要条件
  9. </FONT>                    {return 1;}
  10.                     if (o1.getScore() == o2.getScore())
  11.                     {return 0;}
  12.             }
  13.             return n;
  14.     }
  15. }
复制代码
回复 使用道具 举报
陈红建 发表于 2012-8-15 20:19

改成你这个样子了,结果还是一样,不行
回复 使用道具 举报
黄敏 发表于 2012-8-15 23:05
改成你这个样子了,结果还是一样,不行

我这就行啊 我测试过了 没问题的
回复 使用道具 举报
黄敏 中级黑马 2012-8-15 23:31:58
7#
陈红建 发表于 2012-8-15 23:26
我这就行啊 我测试过了 没问题的

我已经找到原因了,其实是Score这个值根本从头到尾就没有,因为在new Student()对象的时候只有两个参数,所以,呵呵,谢谢你了啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马