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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 yuli2039 于 2014-7-26 23:16 编辑

关于TreeSet的问题,在元素自身具备比较功能的情况下,集合自定了比较器并调用,但是存入元素失败,求大神解答!!!使用自身比较功能能够正常存入
import java.util.*;
class Student implements Comparable //定义了Student 类实现了Comparable 接口,元素自身具备比较性!
{
        String name;
        int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }

        public boolean equals(Object obj)//此处复写了equals方法,如果使用HashSet集合,需要调用此方法
        {
                if (!(obj instanceof Student))
                        return false;
                Student s =(Student)obj;
                return this.name.equals(s.name) && this.age==s.age;
        }

        public int hashCode()//此处复写了hashCode方法,如果使用HashSet集合,需要调用此方法
        {
                return this.name.hashCode()+this.age*23;
        }

        public int compareTo(Object obj)//复写compareTo方法,让元素自身具备比较性(先比name,如果一致,比较age)
        {
                if (!(obj instanceof Student))
                        throw new RuntimeException("不是学生对象");
                Student s =(Student)obj;
                if (this.name.equals(s.name))
                {
                        Integer tage=this.age;
                        Integer sage=s.age;
                        return tage.compareTo(sage);
                }
                return this.name.compareTo(s.name);
        }

        public String getName()//获取name
        {
                return name;
        }

        public int getAge()//获取age
        {
                return age;
        }
}

class MyCompare implements Comparator//自定义比较器,若元素自带比较功能不适用,可适用自定的比较方法(先比age,如一致,再比name)
{
        public int compare(Object o1,Object o2)
        {
                Student s1=(Student)o1;
                Student s2=(Student)o1;
               
                Integer i1=s1.getAge();
                Integer i2=s2.getAge();

                int num= i1.compareTo(i2);
                if (num==0)
                        return s1.getName().compareTo(s2.getName());
                return num;
        }
}

class  TreeSetTest
{
        public static void main(String[] args)
        {
                TreeSet h=new TreeSet(new MyCompare());//此处建立TreeSet集合,调用自定比较器!为什么只存进去了一个"wangli1",18,其他的都没有存进去,使用元素自身的比较功能可以正常存入!!!!
                h.add(new Student("wangli1",18));
                h.add(new Student("wangli2",19));
                h.add(new Student("wangli3",20));
                h.add(new Student("wangli2",30));
                h.add(new Student("wangli3",25));

                Iterator it=h.iterator();
                while (it.hasNext())
                {
                        Student s=(Student)it.next();
                        System.out.println(s.getName()+"......"+s.getAge());
                }
        }
}

7 个回复

倒序浏览
本帖最后由 idency 于 2014-7-26 23:32 编辑
  1. class MyCompare implements Comparator<Student>// 自定义比较器,若元素自带比较功能不适用,可适用自定的比较方法(先比age,如一致,再比name)
  2. {
  3.         public int compare(Student s1, Student s2) {

  4.                 Integer i1 = s1.getAge();
  5.                 Integer i2 = s2.getAge();

  6.                 int num = i1-i2;
  7.                 if (num == 0)
  8.                         return s1.getName().compareTo(s2.getName());
  9.                 return num;
  10.         }
  11. }
复制代码
我把你的比较器部分做了稍微修改,运行正常 其他没有更改
回复 使用道具 举报
本帖最后由 idency 于 2014-7-26 23:36 编辑

比较器在创建时一般知道元素类型的话,可以添加泛型,这样就省去强制转换的麻烦了;
如果不加泛型进行强转也是可以运行的

回复 使用道具 举报
Student s1=(Student)o1;
Student s2=(Student)o1;
两个o1
回复 使用道具 举报
西门吹风 发表于 2014-7-26 23:34
Student s1=(Student)o1;
Student s2=(Student)o1;
两个o1

大哥,我调试了至少一个小时,你一下就发现了!我真是瞎了,自己敲错了:Q
回复 使用道具 举报
。。。。。。。。。。。。。。。。。。。。。。。。。
回复 使用道具 举报
idency 发表于 2014-7-26 23:24
我把你的比较器部分做了稍微修改,运行正常 其他没有更改

已经找到原因,就是强转的时候名字没有改!其他代码没有问题的,还是谢谢了
Student s1=(Student)o1;
Student s2=(Student)o1;
回复 使用道具 举报
看到你这题刚还在查TreeSet加入比较器的问题。。。结果刷新了一下竟然是这错了  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马